簡體   English   中英

實體框架為唯一一個子模型添加區分列

[英]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; }我的背景,我下表中出現以下欄目:

家長:

  • ID
  • SomeAttribute1
  • SomeAttribute2

這是我所期望的。 但是我遇到的問題是,我很可能稍后會在此父類中添加更多子模型,例如另一個類,例如:

public class Child2 : Parent {
     public override int Id { get; set; }
     public string Child2Attribute1 { get; set; }
     public string Child2Attribute2 { get; set; }
}

當我將此子模型添加到上下文中時,我的“ Parent列將變成以下形式:

家長:

  • ID
  • SomeAttribute1
  • SomeAttribute2
  • Child2Attribute1
  • Child2Attribute2
  • 鑒別

我了解區分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不是唯一的(即Child2Child2都可以具有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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM