0

我參與了一個使用實體框架代碼優先將現有C#代碼映射到數據庫的項目。我不打算在這裏重現代碼本身,但我會提出一些應該涵蓋相同問題的僞代碼。使用實體框架代碼首先獲取InvalidOperationException

我想映射一個類到其他類的列表的數據庫。我將向您展示一個示例:

public Class ListClass 
{ 
    public List<SubClassA> ListOne 
    { 
     get { return BaseClass.OfType<SubClassA>().Where(b => !b.BoolOne && b.BoolTwo).ToList(); } 
    } 

public List<SubClassA> ListTwo 
    { 
     get { return BaseClass.OfType<SubClassA>().Where(b => b.BoolOne && b.BoolTwo).ToList(); } 
    } 
} 


public abstract class BaseClass 
{ 
    public bool BoolOne {get; set;} 

    #Region EF 
    public GUID PrimaryKey {get; set;} 
    public GUID ListClassForeignKey {get; set;} 
    #EndRegion 
} 

public class SubClassA : BaseClass 
{ 
    public bool BoolTwo {get; set} 
} 

Class SubClassB : BaseClass 
{ 
    //Contents.. 
} 

摘要:ListClass包含SubClassA的列表。 BaseClass和SubClassA不知道有關ListClass的任何內容。 BaseClass中的GUID屬性被添加用於實體框架,否則不存在已經改變的類。這就是爲什麼我們在這個項目中使用Fluent API的原因:

class ListClassConfiguration : EntityTypeConfiguration<ListClass> 
{ 
    public ListClassConfiguration() 
    { 
     HasKey(f => f.PrimaryKey); 
     Property(f => f.PrimaryKey).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 
     HasMany(f => f.ListOne).WithOptional().HasForeignKey(f => f.ListClassForeignKey); 
     HasMany(f => f.ListTwo).WithOptional().HasForeignKey(f => f.ListClassForeignKey); 

    } 
} 

在Context-class中,我們只需添加此配置。 只要模型更改,數據庫就會被刪除。 我目前使用TPH映射爲BaseClass和它的子類。

當我嘗試添加並保存在列表中refered對象ListClass,我得到這個異常:

InvalidOperationException異常。 外鍵組件'ListClassForeignKey'不是'SubClassA'類型的聲明屬性。驗證它沒有被明確地從模型中排除,並且它是一個有效的基本屬性。

那麼,有什麼建議嗎?

編輯:我注意到,在真實的項目中,似乎有空的列表。我試圖刪除配置類中的foreignkey,並且我得到了一個沒有內容的數據表(一列只有NULL值)。在這個例子中,這意味着只有名字'BaseClass'的TPH表是空的/只有NULL值。這能解釋一些問題嗎?

回答

0

沒關係,一個同志指出列表屬性的一個問題:只有getter,沒有setter,並且它們是基於BaseClass的列表,它也被ListClass使用