2014-09-03 67 views
1

更新:我應該注意到NavigationPropertyClass上的Id屬性不是數據庫生成的。在我的實際模型中,NavigationPropertyClass也是層次結構方案(使用TPH)的一部分,此處未顯示,而NavigationPropertyClassDerivedClass1實例和DerivedClass2實例的集合,但並非所有類都必須從基類從NavigationPropertyClass派生。實體框架6.1:派生類型和標識關係中的1-1和1-many關係


我的模型的一部分看起來像這樣(其他屬性和構造函數爲簡潔起見省略):

//Many other classes inherit from this class 
//and many of the derived classes are not composed of DerivedClass1 or DerivedClass2 
public abstract SomeOtherBaseClass{ 
    public int Id {get; set;} //not database generated, set in the constructor 
} 

public NavigationPropertyClass: SomeOtherBaseClass{ 
    public DerivedClass1 Derived1 {get; set;} 
    public virtual ICollection<DerivedClass2> Derived2Collection {get; set;} 
} 

public abstract class BaseClass{ 
    public int Id {get; set;} 
    //other properties shared by derived classes 
} 

public class DerivedClass1: BaseClass{ 
    public NavigationPropertyClass NavigationProperty {get; set;} 
    //other properties pertinent to DerivedClass1 
} 


public class DerivedClass2: BaseClass{ 
    public NavigationPropertyClass NavigationProperty {get; set;} 
    //other properties pertinent to DerivedClass2 
} 

DerivedClass1具有NavigationPropertyClass 1-1關係,同時DerivedClass2具有許多-1與NavigationPropertyClass的關係。

我試圖在每個派生類中設置標識關係,以便當NavigationPropertyClass的實例從數據庫中刪除時,DerivedClass1的相關實例以及DerivedClass2的任何實例也將被刪除。我可以看到設置的唯一方法是使用TPT繼承,但即便如此,我也無法使事情正常工作。我會發布我的Fluent API配置,但我在這一點上嘗試了很多排列,我不知道應該發佈哪一個。

有沒有辦法做我想做的事情?如果是這樣,Fluent API配置是什麼樣的?

+0

_ Derived2與NavigationPropertyClass_ =具有一對多的關係一個Derived2有很多NavigationPropertyClass? – 2014-09-03 15:06:21

+0

@YuliamChandra編輯,以正確識別關係的方向。 – joelmdev 2014-09-03 15:39:24

+0

EF不必知道'Base',你可以將派生類映射爲獨立的實體。 – 2014-09-03 20:18:42

回答

0

這是適合您的要求的型號。

public abstract class Base 
{ 
    public int Id { get; set; } 
} 
public class Derived1 : Base 
{ 
    public int PropDerived1 { get; set; } 
    public NavigationPropertyClass NavigationProperty { get; set; } 
} 
public class Derived2 : Base 
{ 
    public int PropDerived2 { get; set; } 

    public int NavigationPropertyClassId { get; set; } 
    public NavigationPropertyClass NavigationPropertyClass { get; set; } 
} 
public abstract class SomeOtherBaseClass 
{ 
    public int Id { get; set; } 
} 
public class NavigationPropertyClass : SomeOtherBaseClass 
{ 
    public Derived1 Derived1 { get; set; } 
    public virtual ICollection<Derived2> Derived2s { get; set; } 
} 

,你只需要在配置模型生成器時使用ToTable有TPT的繼承。

public class AppContext : DbContext 
{ 
    public DbSet<SomeOtherBaseClass> SomeOtherBaseClasses { get; set; } 
    public DbSet<Base> Bases { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Derived1>().ToTable("Derived1"); 
     modelBuilder.Entity<Derived2>().ToTable("Derived2"); 
     modelBuilder.Entity<NavigationPropertyClass>().ToTable("NavigationPropertyClass"); 

     modelBuilder.Entity<NavigationPropertyClass>() 
      .HasRequired(x => x.Derived1) 
      .WithRequiredDependent(x => x.NavigationProperty); 
    } 
} 

並留下一切EF convention,除非NavigationPropertyClass::Id也是FK到Derived1的組成部分。

結果

Result

簡體上NavigationPropertyClass表生成約束:

PRIMARY KEY [Id] 
FOREIGN KEY([Id]) REFERENCES [dbo].[Derived1] ([Id]) 
FOREIGN KEY([Id]) REFERENCES [dbo].[SomeOtherBaseClasses] ([Id]) 

更多

+0

它看起來像我可能已經過分簡化了我的模型,因爲NavigationPropertyClass上的Id不是標識列,因此NavigationPropertyClass是關係的主要端點。我會相應地更新我的問題。 – joelmdev 2014-09-03 16:01:20

+0

問題已更新 – joelmdev 2014-09-03 16:17:03

+2

@joelmdev,我根據您更新的問題更新了答案 – 2014-09-03 16:35:53