2012-11-03 160 views
0

我有以下實體類Code。它存儲了不同種類的類別 - 我所需要的數據以創建許多小表格,例如用戶類別,費用類別,地址類型,用戶類型,文件格式等用實體框架代碼優先定義外鍵約束

public class Code 
{ 
    public int Id { get; set; } 
    public string CodeType { get; set; } 
    public string CodeDescription { get; set; } 


    public virtual ICollection<Expense> Expenses { get; set; } 
    public virtual ICollection<Address> Addresses { get; set; } 
        : 
        : // many more 

} 

Expense看起來是這樣的:

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

    public int CategoryId { get; set; } 
    public virtual Code Category { get; set; } 

    public int SourceId { get; set; } 

    public double Amount { get; set; } 
    public DateTime ExpenseDate { get; set; } 
} 

通過上述類定義,我已經建立了1:許多關係在CodeExpense之間使用CategoryId映射。

我的問題是,我想將Expense中的SourceId字段映射到Code對象。這意味着,Expense對象將包含

public Code Source { get; set; } 

如果我用這個,在運行時我得到循環依賴錯誤。

有人可以幫忙嗎?

+0

你能發佈你的映射嗎? – khellang

回答

0

您將需要禁用兩個關係中的至少一個(或兩者)上的級聯刪除。 EF通過慣例爲兩種關係啓用級聯刪除,因爲兩者都是要求,因爲外鍵屬性不可爲空。但是,SQL Server不接受多個到兩個關係引入的同一個表上的級聯刪除路徑。這是你例外的原因。

必須覆蓋以流利的API的約定:

public class Code 
{ 
    public int Id { get; set; } 
    //... 
    public virtual ICollection<Expense> Expenses { get; set; } 
    //... 
} 

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

    public int CategoryId { get; set; } 
    public virtual Code Category { get; set; } 

    public int SourceId { get; set; } 
    public virtual Code Source { get; set; } 
    //... 
} 

映射用流利的API;

modelBuilder.Entity<Expense>() 
    .HasRequired(e => e.Category) 
    .WithMany(c => c.Expenses) 
    .HasForeignKey(e => e.CategoryId) 
    .WillCascadeOnDelete(false); 

modelBuilder.Entity<Expense>() 
    .HasRequired(e => e.Source) 
    .WithMany() 
    .HasForeignKey(e => e.SourceId) 
    .WillCascadeOnDelete(false); 
+0

謝謝百萬Slauma - 它的奇蹟!你搖滾......我花了這麼多時間,幾乎已經想到改變某種方法。再次感謝! – Sandeep