![](/img/trans.png)
[英]Why is Entity Framework creating a discriminator column for my View Model?
[英]Entity Framework Add Discriminator Column for Only One Child Model
我有一個抽象的父模型,因此無法創建它的實例,目前,我有一個從其繼承的子類。 例如,我有這樣的東西:
public abstract class Parent {
public virtual int Id { get; set; }
}
public class Child1 : Parent {
public override int Id { get; set; }
public string SomeAttribute1 { get; set; }
public string SomeAttribute2 { get; set; }
}
我正在使用實體框架填充我的數據庫模型,並且在添加時
public virtual IDbSet<Child1> Child1 { get; set; }
public virtual IDbSet<Child1> Child1 { get; set; }
我的背景,我下表中出現以下欄目:
家長:
這是我所期望的。 但是我遇到的問題是,我很可能稍后會在此父類中添加更多子模型,例如另一個類,例如:
public class Child2 : Parent {
public override int Id { get; set; }
public string Child2Attribute1 { get; set; }
public string Child2Attribute2 { get; set; }
}
當我將此子模型添加到上下文中時,我的“ Parent
列將變成以下形式:
家長:
我了解區分Child2
的概念,但是我的問題是,在添加Child2
類之前,我的數據庫中已經存在的所有Child1
對象都沒有區分Child2
列,然后將具有空值。
我想這些空的鑒別符值會在以后嘗試訪問它們時引起問題,所以我的問題是,有沒有辦法在只有一個子實體的模型上強制一個鑒別符列?
還是有一種更好的方法來搶先處理/准備在以后添加更多子類?
還是有一個很好的方法將這兩個子類作為自己的表? 我從來沒有對Entity Framework做過很多花哨的OOP,所以我不確定他們最好的方法是什么。
謝謝你的幫助!
編輯
我研究了3種不同的繼承模型:TPH,TPT和TPC。 TPH不是適用於我的情況的模型,但是TPT和TPC都可以工作。 正如我在答案中提到的那樣,我讓TPT工作了,但是TPC是我的用例的理想選擇,因為我不一定要/不需要將父類存儲在數據庫中(但在我的上下文中仍然希望使用它)。 我設法使TPC幾乎可以正常工作,並對我的代碼進行了以下更改:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Child1>().Map(m =>
{
m.MapInheritedProperties();
m.ToTable("Child1");
});
modelBuilder.Entity<Child2>().Map(m =>
{
m.MapInheritedProperties();
m.ToTable("Child2");
});
}
並將我的父模型更改為:
public abstract class Parent {
[DatabaseGenerated(DatabaseGenerationOption.Identity)]
public virtual int Id { get; set; }
}
但是然后我看到的問題是,在Child1
中填充的Id不是唯一的(即Child2
和Child2
都可以具有Id = 1,但是這意味着那時有2個Parent
對象的Id = 1,這違反了唯一性關鍵約束。
有沒有一種方法可以強制自動生成的ID在各個孩子之間是唯一的?
感謝Bradley Uffner的建議,我找到了解決問題的方法:
Table-Per-Type通過僅將父類添加到上下文中,然后在添加每個子類時為它們創建單獨的表來達到目的,如下所示:
public virtual IDbSet<Parent> Parents { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Child1>().ToTable("Child1");
modelBuilder.Entity<Child2>().ToTable("Child2");
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.