【问题标题】:Getting "Foreign Key constraint" even though cascade delete is turned off即使级联删除已关闭,也获得“外键约束”
【发布时间】: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 =&gt; Location在删除时不会级联
  • 我会记住那个以备将来提问

标签: c# entity-framework


【解决方案1】:

这个数据模型对你有用吗?

这样您可以添加新类型的电话号码

    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; }
        }

【讨论】:

  • 这如何回答这个问题?
  • 如果修改数据模型并避免不必要的子表,我相信这是更好的方法
  • 谢谢。但我不想因为应该可以解决的问题而改变我的数据结构
猜你喜欢
  • 2011-02-24
  • 2014-01-17
  • 2019-12-24
  • 1970-01-01
  • 1970-01-01
  • 2019-04-26
  • 2022-01-01
  • 2011-02-02
相关资源
最近更新 更多