2014-02-19 103 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