【问题标题】: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 约束。

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

【问题讨论】:

    标签: c# sql code-first


    【解决方案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;();,但仍然出现同样的错误,请您详细说明您的解决方案,我是代码第一世界的新手,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多