C# 实体框架6.1:派生类型中的1-1和1-many关系以及标识关系
更新:我应该注意到C# 实体框架6.1:派生类型中的1-1和1-many关系以及标识关系,c#,entity-framework,entity-framework-6.1,ef-fluent-api,C#,Entity Framework,Entity Framework 6.1,Ef Fluent Api,更新:我应该注意到NavigationPropertyClass上的Id属性不是由数据库生成的。在我的实际模型中,NavigationPropertyClass也是层次结构方案的一部分(使用TPH),这里没有显示,而NavigationPropertyClass有一个DerivedClass1实例和一组DerivedClass2实例,对于从派生NavigationPropertyClass的基类继承的所有类,情况未必如此 我的模型的一部分看起来像这样(为了简洁起见,省略了其他属性和构造函数):
NavigationPropertyClass
上的Id
属性不是由数据库生成的。在我的实际模型中,NavigationPropertyClass
也是层次结构方案的一部分(使用TPH),这里没有显示,而NavigationPropertyClass
有一个DerivedClass1
实例和一组DerivedClass2
实例,对于从派生NavigationPropertyClass
的基类继承的所有类,情况未必如此
我的模型的一部分看起来像这样(为了简洁起见,省略了其他属性和构造函数):
//许多其他类继承自该类
//许多派生类不是由DerivedClass1或DerivedClass2组成的
公共抽象SomeOtherBaseClass{
public int Id{get;set;}//未生成数据库,在构造函数中设置
}
公共导航属性类:SomeOtherBaseClass{
public-DerivedClass1-Derived1{get;set;}
公共虚拟ICollection Derived2Collection{get;set;}
}
公共抽象类基类{
公共int Id{get;set;}
//派生类共享的其他属性
}
公共类DerivedClass1:基类{
公共NavigationPropertyClass NavigationProperty{get;set;}
//与DerivedClass1相关的其他属性
}
公共类派生类2:基类{
公共NavigationPropertyClass NavigationProperty{get;set;}
//与DerivedClass2相关的其他属性
}
DerivedClass1
与NavigationPropertyClass
有1-1关系,而DerivedClass2
与NavigationPropertyClass
有多-1关系
我试图在每个派生类中设置标识关系,以便在从数据库中删除NavigationPropertyClass
的实例时,DerivedClass1
的关联实例和DerivedClass2
的任何实例也会被删除。我能看到的唯一设置方法是使用TPT继承,但即使如此,我也无法让事情正常工作。我会发布我的Fluent API配置,但我在这一点上尝试了太多的排列,以至于我不知道该发布哪一个
有什么办法可以做我想做的事吗?如果是这样,Fluent API配置是什么样子的?这是适合您需求的模型
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; }
}
并将所有内容留给,除了NavigationPropertyClass::Id
也是Derived1
的FK的部分
结果
在NavigationPropertyClass
表上简化生成的约束:
PRIMARY KEY [Id]
FOREIGN KEY([Id]) REFERENCES [dbo].[Derived1] ([Id])
FOREIGN KEY([Id]) REFERENCES [dbo].[SomeOtherBaseClasses] ([Id])
更多
Base
,您可以将派生类映射为独立实体。看起来我可能过于简化了我的模型,因为NavigationPropertyClass上的Id不是标识列,因此NavigationPropertyClass是关系的主要端点。我将相应地更新我的问题。@joelmdev,我根据您更新的问题更新了答案
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);
}
}
PRIMARY KEY [Id]
FOREIGN KEY([Id]) REFERENCES [dbo].[Derived1] ([Id])
FOREIGN KEY([Id]) REFERENCES [dbo].[SomeOtherBaseClasses] ([Id])