2014-09-03 57 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