【发布时间】:2015-07-06 14:17:29
【问题描述】:
我有以下用户模型:
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);
我希望这些流畅的规则能够帮助我解决任何级联删除问题。但是当我尝试在控制台中运行“Update-Database”时仍然收到以下错误:
引入 FOREIGN KEY 约束“FK_dbo.User_dbo.PhoneNumber_FaxId” 在表“用户”上可能会导致循环或多个级联路径。指定开 DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。无法创建约束。查看以前的错误。
注意:请注意,这不是该问题的重复项:Introducing FOREIGN KEY constraint may cause cycles or multiple cascade paths - why?
如您所见:在投票最多的答案中提出的建议已包含在我的代码中(Fluent 部分)
(更新)这是 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 本身有一些简单的属性(字符串、整数等)和对“位置”(以及用户)的引用。
【问题讨论】:
-
这实际上是关于循环,而不是级联删除本身。
-
@Noel 不,根本不是。您的链接问题的答案已包含在我的代码中。
-
您需要指定
PhoneNumberPool => Location在删除时不会级联 -
我会记住那个以备将来提问
标签: c# entity-framework