如何首先在代码中实现多级继承
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 个抽象类 Address 和 PersonalDetail 以及 2 个派生类 AccountHolder 和 Nominee。 PersonalDetail 继承 address 并进一步 AccountHolder 和 Nominee 继承 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<OneToManyCascadeDeleteConvention>();
,但仍然出现同样的错误,请您详细说明您的解决方案,我是代码第一世界的新手,谢谢!以上是关于如何首先在代码中实现多级继承的主要内容,如果未能解决你的问题,请参考以下文章