2013-10-14 109 views
0

請原諒我令人困惑的標題,但不簡單地說它簡而言之。代碼第一對一與兩個相同的實體

我在定義我的代碼優先模型中的多對多關係時遇到了問題。 這是我第一個使用代碼第一個框架的項目,我需要一些幫助。

我有兩個型號,ItemTrade。這背後的故事就是建立一個物品交易網站。

交易涉及從A人發送給B人的一件或多件物品,一件或多件物品從B人發回A人,完成交易。

一個項目只屬於一個交易,但一個交易可以有多個項目。

這就是我的模型看起來如何。

項目

public class Item 
{ 
    public int ItemId { get; set; } 
    public string Name { get; set; } 
    public int TradeId { get; set; } 

    [ForeignKey("TradeId")] 
    public virtual Trade Trade { get; set; } 
} 

貿易

public class Trade 
{ 
    public int TradeId { get; set; } 

    public virtual ICollection<Item> ItemsToSend { get; set; } 
    public virtual ICollection<Item> ItemsToReturn { get; set; } 
} 

但試圖運行update-database我收到以下錯誤時。

System.Data.SqlClient.SqlException:INSERT語句與FOREIGN KEY約束「FK_dbo.Items_dbo.Trades_TradeId」衝突。衝突發生在數據庫「MyDB」,表「dbo.Trade」,列'TradeId'。

任何幫助非常感謝,謝謝!

+1

嘗試刪除數據註解。或者,如果您的數據庫尚未填充,請將其放下並重新創建。 – Tico

+0

看起來你的數據庫已經有了數據,並且遷移由於約束而失敗。 –

+0

謝謝大家。但我認爲'Global.asax'中的這一行確保數據庫正在被丟棄。 'Database.SetInitializer(新DropCreateDatabaseIfModelChanges ());' – Martin

回答

0

我現在通過添加物品和交易的平面結構來解決它。像許多項目和交易一樣。

由於我知道每件商品的所有者,因此我還可以通過在交易中添加senderId和returnerId來理清發件人和退貨人。

這就是我現在的模型。

項目

public class Item 
{ 
    public int ItemId { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<Trade> Trades { get; set; } 
} 

貿易

public class Trade 
{ 
    public int TradeId { get; set; } 
    public virtual UserProfile SendUser { get; set; } 
    public virtual UserProfile ReturnUser { get; set; }  
    public virtual ICollection<Item> Items { get; set; } 
} 

這適用於現在..

0

這樣的:「一個項目只能屬於一個行業,而是一個行業可以有許多項目。「聽起來像一對多?

如果您可以在沒有Item到Trade的反向引用的情況下執行映射,那麼映射將會簡單得多。

這種模式將地圖無需任何配置:

public class Trade 
{ 
    public int Id { get; set; } 
    public virtual ICollection<Item> ItemsToSend { get; set; } 
    public virtual ICollection<Item> ItemsToReturn { get; set; } 
} 

public class Item 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

使用此代碼插入數據:

 var trade = new Trade 
     { 
      ItemsToReturn = new [] { new Item{ Name = "Item to return 1"}, new Item{ Name = "Item to return 2"}}, 
      ItemsToSend = new [] { new Item{ Name = "Item to send 1"}, new Item{ Name = "Item to send 2"} } 
     }; 
     context.Trades.Add(trade); 

     context.SaveChanges(); 

將產生項目表看起來像這樣:

enter image description here

一個包含單行的交易表單身Id列。

如果您需要從一個項目導航到它所屬的交易,您可以做一個查詢。

E.g以獲得貿易與ID = 3項屬於你可以這樣做:

using (var db = new TradingContext()) 
{    
    var tradeOfItem3 = db.Trades. 
     FirstOrDefault(t => t.ItemsToReturn.Any(i => i.Id == 3) || t.ItemsToSend.Any(i => i.Id == 3)); 
} 
相關問題