2016-04-14 80 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定義? –