2010-02-04 62 views
11

我剛開始與Linq玩弄實體並遇到了一個我無法弄清楚的問題。具有繼承,條件和外鍵的實體框架

我正在此錯誤:

Condition member 'RelatedResources.TypeID' with a condition other than 'IsNull=False' is mapped. Either remove the condition on RelatedResources.TypeID or remove it from the mapping.

存在的條件設在限定RelatedResource(圖書,鏈接,導軌等)的類型的抽象實體RelatedResource一個TYPEID字段。 TypeID也是外鍵,並且在與資源類型實體的關聯中映射。我認爲這是問題,但我不知道如何或爲什麼我應該改變這一點。

+0

爲什麼TYPEID外鍵? – NotDan 2010-02-04 15:45:03

+0

用於db中ResourceTypes和RelatedResources之間的關係。 – Mike 2010-02-04 15:49:09

+0

我對此開始賞金,因爲回答標記爲此問題答案的回答不完整,因爲在整個互聯網上都存在此問題的示例。基本上它與在基礎實體中使用外鍵作爲從這個基礎繼承的實體之間的區別。 – mare 2010-11-27 17:01:52

回答

9

這通常發生在將TypeID作爲條件並將其用作屬性時。它可能會導致問題,因爲您正在使用它來將關聯映射到ResourceType,並將其用作繼承的條件。

+0

這就是我在想什麼,但我不知道它的方式。 – Mike 2010-02-04 15:47:45

+0

您是否嘗試使用ResourceType實體/表來確定RelatedResource的類型?即如果ResourceType.Name ==「Book」,那麼RelatedResource的實際類型是Book?如果是這樣的話,你的混合繼承與遏制(不幸的是,實體框架不喜歡)。從OOP的角度來看,名稱/圖標屬性實際上應該存在於繼承的類中(即Book應該定義自己的名稱和圖標,而不是另一種類型) – NotDan 2010-02-04 15:59:14

+0

正確...好點。我會稍微玩一下。謝謝。 – Mike 2010-02-04 16:03:49

0

RelatedResources.TypeIDRelatedResources.TypeID在數據庫和實體框架模式中設置爲非空(即'Isnull = false')嗎?

不確定您是否都可以將該字段作爲條件並充當另一個表的外鍵。

如果你使用條件繼承來確定類型,你會需要嗎?

+0

是我不應該有typeID的空值。 – Mike 2010-02-04 15:45:37

0

聽起來像表每層次(TPH)繼承錯誤:

https://docs.microsoft.com/en-us/aspnet/mvc/overview/getting-started/getting-started-with-ef-using-mvc/implementing-inheritance-with-the-entity-framework-in-an-asp-net-mvc-application

在基類屬性使用[NotMapped]

僞代碼:

public abstract class MyBaseClass 
{ 
    [NotMapped] 
    public MyEnum MyEnum { get; protected set; } 
} 


public class DerivedOne: MyBaseClass 
{ 
    public DerivedOne() 
    { 
     MyEnum = MyEnum.Value1; 
    } 

    public string MyDerivedOneString { get; set; } 
} 

public class DerivedTwo: MyBaseClass 
{ 
    public DerivedTwo() 
    { 
     MyEnum = MyEnum.Value2; 
    } 
} 

public class MyDbContext : DbContext 
{ 
    DbSet<MyBaseClass> MyBaseClass { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     base.OnModelCreating(modelBuilder); 

     modelBuilder.Entity<MyBaseClass>() 
      .Map<DerivedOne>(x => x.Requires("MyEnum").HasValue((int)MyEnum.Value1)) 
      .Map<DerivedTwo>(x => x.Requires("MyEnum").HasValue((int)MyEnum.Value2)); 
    } 
}