2014-02-19 53 views
1

使用:VS 2013,实体框架代码首先,ASP.NET Web项目MVC“引进国外KEY约束”

我有2个型号,在一个需要2 FK同一个表:

public class A 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 
public class B 
{ 
    public int Id { get; set; } 

    public int Id1 { get; set; } 

    [ForeignKey("Id1")] 
    public virtual A A1 { get; set; } 

    public int Id2 { get; set; } 

    [ForeignKey("Id2")] 
    public virtual A A2 { get; set; } 
} 

enable-migrationAdd-Migration Test后,当我运行Update-Database,我得到这样的信息:

上表“B”将外源KEY约束“FK_dbo.B_dbo.A_Id2”可能会导致循环或多个级联p ATHS。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束。

+0

我认为,属性是多余的,cuz EF将Id1和Id2道具作为合适实体的键。 –

回答

0

使用此代码

public class A 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 
public class B 
{ 
    public int Id { get; set; } 

    public int Id1 { get; set; } 

    [ForeignKey("Id1")] 
    public virtual A A1 { get; set; } 

    public int Id2 { get; set; } 

    [ForeignKey("Id2")] 
    public virtual A A2 { get; set; } 
} 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<B>() 
        .HasRequired(e => e.A1) 
        .WithMany() 
        .HasForeignKey(c => c.Id1) 
        .WillCascadeOnDelete(false) 

        .HasRequired(e => e.A2) 
        .WithMany() 
        .HasForeignKey(c => c.Id2) 
        .WillCascadeOnDelete(false) 
        ;  
    } 

ALSE你可以使用inverseProperty属性。

+0

你是对的,但也许你可以向读者解释是什么导致了差异。而且,通过流畅的映射,您可以在没有属性的情况下执行操作。 –

+0

当两个表有很多关系时,你必须使用流利的API来设置.WillCascadeOnDelete(false),并且通过数据Annonation你不能这样做。 – Iraj

+0

我使用你的解决方案,做一些小改动:在OnModelCreating中调用base.OnModelCreating(modelBuilder),并移除B类中的ForeignKey注释。对于我来说,如果我将其放入另一个项目中,同样的类,A和B以及OnModelCreating中相同的代码,Add-Migration添加了几个字段,那么真的很奇怪:A1_Id = c.Int(),A2_Id = c.Int (),A_Id = c.Int(),A_Id1 = c.Int(),. ForeignKey(“dbo.A”,t => t.A1_Id).ForeignKey(“dbo.A”,t => t.A2_Id ).ForeignKey(“dbo.A”,t => t.A_Id).ForeignKey(“dbo.A”,t => t.A_Id1) – Narcis