Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架6.1:派生类型中的1-1和1-many关系以及标识关系_C#_Entity Framework_Entity Framework 6.1_Ef Fluent Api - Fatal编程技术网

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])
更多


虽然Derived2与NavigationPropertyClass有一对多的关系=>一个Derived2有多个NavigationPropertyClass?@YuliamChandra经过编辑以正确识别关系的方向。EF不必知道
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])