2016-04-14 81 views
0

我对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

+0

你确定'ToList'中的'Operation'类型是来自你的模型而不是另一个命名空间中的某个类? –

+0

由VS生成的'Operation'类位于命名空间'PanelDeploymentTool'中。在我的代码'this.m_DB.Operations.ToList ()'当我将鼠标悬停在Operation字上时,IDE中的工具提示显示文本“class PanelDeploymentTool.Operation”。基于这一点,我认为这是正确的课程。如有需要,我会很乐意发布其他信息。 –

回答

0

我解决了,虽然我仍然不知道原因是什么。

  1. 我在模型浏览器中打开了数据模型。
  2. 我从我的Operation实体中删除了除1列之外的所有列 - ID。
  3. 然后它工作。
  4. 我开始逐一添加列。
  5. Operation实体(类)现在看起来是这样的:

    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 ChangedOn { get; set; } 
    public bool IsInUse { get; set; } 
    public bool DoesTCApply { get; set; } 
    public string OperationContent { get; set; } 
    
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] 
    public virtual ICollection<ParameterSet> ParameterSets { get; set; } 
    

    }

它的工作原理。

+0

您是否更改过Operation表中的任何数据?什么是表格的sql定义? –