我对Entity Framework还是比较陌生的,这也许就是为什么我已经拉近我的头发了(来自Windows窗体)。SQLite VS2013实体框架6 InvalidCastException
我正在VS2013中创建一个使用SQLite和EF 6的WPF应用程序,目标框架是v.4.5。
我正在使用数据库第一种方法。我使用VS2013的服务器资源管理器工具创建了一个SQLite数据库。然后,我从现有数据库(在向导中选中 - 包括外键和Pluralize或Singularize对象名称)中将ADO.NET实体数据模型添加到我的项目中。该向导为我创建了“TemplateDataModel.edmx”。我的DbContext被称为“TemplateEntities”。 我的问题是这样的。我实例化上下文:
this.m_DB = new TemplateEntities();
当我想从所谓的“操作”数据表中获取的记录列表我用这个代码:
this.m_DB.Operations.ToList<Operation>()
调用此方法始终引发InvalidCastException。操作类(由VS生成)的代码是这样的:
public partial class Operation
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public Operation()
{
this.ParameterSets = new HashSet<ParameterSet>();
}
public long ID { get; set; }
public long OperationPLC_ID { get; set; }
public string OperationIdentifier { get; set; }
public System.DateTime ChangedOnDate { get; set; }
public bool IsInUse { get; set; }
public string OperationContent { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<ParameterSet> ParameterSets { get; set; }
}
我敢肯定,我只有在项目的命名空间中定义1“操作”类。 奇怪的是,查询其他表很好用。只有这张表我无法查询。 DbSet的其他方法也会抛出InvalidCastException,例如
this.m_DB.Operations.First<Operation>()
我也应该说我安装EF时遇到了问题,首先使用SQLite工作。我不得不在这个论坛上发现一个解决方法。我将项目转换为.NET Framework v。4.0,然后使用NuGet包管理器安装EF,然后将项目切换回v。4.5(因为我在GUI中使用了功能区,似乎在.NET 4.0中不可用) 。
谢谢你的任何建议。
正如我在下面提到的,它现在起作用。 @Sergey L - 是的,我改变了表中的数据。实际上,我开始从Operation表中逐一删除列,直到我只有一列 - ID列。然后它工作。然后我开始添加列。每添加一列之后,删除整个数据模型,并使用Visual Studio的添加“ADO.NET实体数据模型”功能重新创建它。
@Sergey L - 我不知道怎么拉从Visual Studio的服务器资源管理器中的SQL定义,但该表设计的屏幕截图是在这里: enter image description here
你确定'ToList'中的'Operation'类型是来自你的模型而不是另一个命名空间中的某个类? –
由VS生成的'Operation'类位于命名空间'PanelDeploymentTool'中。在我的代码'this.m_DB.Operations.ToList()'当我将鼠标悬停在Operation字上时,IDE中的工具提示显示文本“class PanelDeploymentTool.Operation”。基于这一点,我认为这是正确的课程。如有需要,我会很乐意发布其他信息。 –