我參與了一個使用實體框架代碼優先將現有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值。這能解釋一些問題嗎?