1

我有以下使用 EF 5 代码优先的简化类,其中我的 B 类有多个 FK 指向 A 类。

public class A
{
   public int Id {get;set;}
   ICollection<B> Bs {get;set;}
}

public class B
{
   public int Id {get;set;}

   public int A1Id {get;set;}
   public int A2Id {get;set;}
   public int A3Id {get;set;}

   [ForeignKey("A1Id")]
   public A A1 {get;set;}
   [ForeignKey("A2Id")]
   public A A2 {get;set;}
   [ForeignKey("A3Id")]
   public A A3 {get;set;}
}

当我尝试构建我的表时,我收到此错误: 在表“B”上引入 FOREIGN KEY 约束“FK_dbo.B_dbo.A_A1Id”可能会导致循环或多个级联路径。指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。无法创建约束。请参阅以前的错误。

我尝试通过 EntityTypeConfiguration 修改级联规则:

        HasOptional(x => x.A1)
            .WithMany()
            .HasForeignKey(p => p.A1Id)
            .WillCascadeOnDelete(false);

也试过这个:

            HasOptional(x => x.A1)
            .WithMany()
            .Map(y => y.MapKey("A1Id"))
            .WillCascadeOnDelete(false);

遵循此建议:多个外键到同一个主键表

但仍然得到同样的错误。我所有的 A1、A2 和 A3 FK 都是可选的。

有关如何解决此错误的任何想法?

谢谢!

4

1 回答 1

2

你必须像这样修改你的类:

public class A
{
    public int Id { get; set; }
    public virtual ICollection<B> B1s { get; set; }
    public virtual ICollection<B> B2s { get; set; }
    public virtual ICollection<B> B3s { get; set; }
}

public class B
{
    public int Id { get; set; }
    public int? A1Id { get; set; }
    public int? A2Id { get; set; }
    public int? A3Id { get; set; }

    public virtual A A1 { get; set; }
    public virtual A A2 { get; set; }
    public virtual A A3 { get; set; }
}

将您更改Fluent API为:

modelBuilder.Entity<B>()
.HasOptional(b => b.A1)
.WithMany(a => a.B1s)
.HasForeignKey(k => k.A1Id)
.WillCascadeOnDelete(false);

modelBuilder.Entity<B>()
.HasOptional(b => b.A2)
.WithMany(a => a.B2s)
.HasForeignKey(k => k.A2Id)
.WillCascadeOnDelete(false);

modelBuilder.Entity<B>()
.HasOptional(b => b.A3)
.WithMany(a => a.B3s)
.HasForeignKey(k => k.A3Id)
.WillCascadeOnDelete(false);

这将为您提供以下表结构:

表结构

于 2013-10-18T18:09:52.530 回答