如何首先在代码中实现多级继承

Posted

技术标签:

【中文标题】如何首先在代码中实现多级继承【英文标题】:How to implement Multilevel inheritance in code first 【发布时间】:2013-03-04 19:21:31 【问题描述】:

我正在使用 Code First 方法来创建数据库。我正在尝试使用 TPH(每个层次结构的表)继承。我的 POCO 课程是:

public abstract class Address

    public int AddressId  get; set; 
    ...


public abstract class PersonalDetail : Address

    public int PersonalDetailId  get; set; 
    ...   


public partial class AccountHolder : PersonalDetail

    public int AccountHolderId  get; set; 


public partial class Nominee : PersonalDetail

    public int NomineeId  get; set; 

我创建了 2 个抽象类 AddressPersonalDetail 以及 2 个派生类 AccountHolderNomineePersonalDetail 继承 address 并进一步 AccountHolderNominee 继承 PersonalDetail。我流利的api代码是:

        modelBuilder.Entity<Address>().Map<PersonalDetail>(m => m.Requires("AddressOf"));
        modelBuilder.Entity<PersonalDetail>().Map<AccountHolder>(m => m.Requires("PersonalDetailOf"));
        modelBuilder.Entity<PersonalDetail>().Map<Nominee>(m => m.Requires("PersonalDetailOf"));

现在,当我尝试插入数据时,它会引发异常,即:

在表“地址”上引入 FOREIGN KEY 约束“FK_dbo.Addresses_dbo.Addresses_AccountHolder_AddressId”可能会导致循环或多个级联路径。指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。

谁能告诉我这是什么问题,我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

你应该将 WillCascadeOnDelete 设为 false

 modelBuilder.Entity<T>()
                    .HasRequired(e => e.)
                    .WithMany(t => t.)
                    .HasForeignKey(e => e.)
                    .WillCascadeOnDelete(false);

或使用此代码\

    modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();   

【讨论】:

我使用了modelBuilder.Conventions.Remove&lt;OneToManyCascadeDeleteConvention&gt;();,但仍然出现同样的错误,请您详细说明您的解决方案,我是代码第一世界的新手,谢谢!

以上是关于如何首先在代码中实现多级继承的主要内容,如果未能解决你的问题,请参考以下文章

如何在javascript中实现分层多级数据表?

如何在 Rust 中实现多级柯里化函数?

如何在 Bootstrap v4.1 中实现多级下拉菜单? [复制]

如何在使用 TPT 层次结构时首先在 EF 代码中实现并发

如何将领域类与EF代码第一层分离并在项目中实现DDD

实体框架映射多级属性