![](/img/trans.png)
[英]DELETE fails with “foreign key constraint failed” even though ON DELETE CASCADE is specified
[英]Getting “Foreign Key constraint” even though cascade delete is turned off
我有以下用戶模型:
public class User
{
public Guid Id { get; set; }
[ForeignKey("Location")]
public Guid LocationId { get; set; }
public Location Location { get; set; }
[ForeignKey("MainPhoneNumber")]
public Guid? MainPhoneNumberId { get; set; }
[ForeignKey("Mailbox")]
public Guid? MailboxId { get; set; }
[ForeignKey("Fax")]
public Guid? FaxId { get; set; }
[MaxLength(50)]
public string UserName { get; set; }
[ForeignKey("Conference")]
public Guid? ConferenceId { get; set; }
public virtual PhoneNumber MainPhoneNumber { get; set; }
public virtual PhoneNumber Mailbox { get; set; }
public virtual PhoneNumber Fax { get; set; }
public virtual PhoneNumber Conference { get; set; }
public virtual ICollection<AddOn> AddOns { get; set; }
}
我還使用Fluent Api添加了以下規則:
modelBuilder.Entity<User>()
.HasRequired(usr=>usr.Location)
.WithMany()
.WillCascadeOnDelete(false);
modelBuilder.Entity<User>()
.HasOptional(usr => usr.Fax)
.WithMany()
.WillCascadeOnDelete(false);
modelBuilder.Entity<User>()
.HasOptional(usr => usr.Conference)
.WithMany()
.WillCascadeOnDelete(false);
modelBuilder.Entity<User>()
.HasOptional(usr => usr.Mailbox)
.WithMany()
.WillCascadeOnDelete(false);
modelBuilder.Entity<User>()
.HasOptional(usr => usr.MainPhoneNumber)
.WithMany()
.WillCascadeOnDelete(false);
我希望這些流利的規則可以幫助我解決所有Cascade刪除問題。 但是嘗試在控制台中運行“ Update-Database
”時仍然收到以下錯誤:
在表'User'上引入FOREIGN KEY約束'FK_dbo.User_dbo.PhoneNumber_FaxId'可能會導致循環或多個級聯路徑。 指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY約束。 無法創建約束。 請參閱先前的錯誤。
注意:請注意, 這不是該問題的重復項 : 引入FOREIGN KEY約束可能會導致循環或多個級聯路徑-為什么?
如您所見:在最高投票答案中提出的建議已包含在我的代碼中(流利的部分)
(更新)這是PhoneNumber類:
public class PhoneNumber
{
public Guid Id { get; set; }
[ForeignKey("PhoneNumberPool")]
public Guid PhoneNumberPoolId { get; set; }
public virtual PhoneNumberPool PhoneNumberPool { get; set; }
public int Length { get; set; }
}
PhoneNumberPool本身具有一些簡單屬性(字符串,整數等)和對“位置”(以及用戶)的引用。
這個數據模型對您有用嗎?
這樣您可以添加新的電話號碼類型
public enum PhoneNumberType {Main, Mailbox, Fax, Conference, Other}
PhoneNumber{
public PhoneNumberType NumberType{get;set;};
public string Number{get;set;};
//other properties
public virtual User{get;set;}
}
public class User
{
public Guid Id { get; set; }
[ForeignKey("Location")]
public Guid LocationId { get; set; }
public Location Location { get; set; }
[MaxLength(50)]
public string UserName { get; set; }
public virtual List<PhoneNumber> PhoneNumbers { get; set; }
public virtual ICollection<AddOn> AddOns { get; set; }
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.