2014-06-11 79 views
0

我使用實體框架來保存多對多關係。 很明顯,部分關係已經在數據庫中出現了,它給了我一個重複的KEY錯誤。更新多對多關係 - 實體框架

如何使插入的實體框架覆蓋?

我的錯誤:

System.Data.SqlClient.SqlException: Violation of PRIMARY KEY constraint 'PK__PaymentL__3214EC07CE1C6DCF'. Cannot insert duplicate key in object 'dbo.PaymentLine'. The duplicate key value is (47c78fb5-b536-4920-b7e6-c925e9879aee). 

我的一個表是這樣的:

CREATE TABLE [dbo].[PaymentLine](
[Id] [uniqueidentifier] NOT NULL, 
... 
PRIMARY KEY CLUSTERED 
(
[Id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,   ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

回答

0

你想要做的就是實現類似的相關集合的「插入或更新」。這不是直接可能的。

如果您需要使用EF做類似的事情,您需要通過加載相關實體來檢查數據庫中是否存在關係。如果存在,請保持原樣並保存更改。如果它不存在,請創建它並保存更改。

例如,當你有很多的關係,以項目和顏色之間有許多,並且要插入或更新一個顏色的顏色集合,你需要檢查如果顏色已經存在:

var itemId = 12; // The item 
var colorId = 18; // The color to insert or update 
Color color = ctx.Items.Single(i => i.ItemId == itemId) 
        .Colors.FirstOrDefault(c => c.ColorId == colorId); 

那麼如果colornull,你知道你必須插入顏色:

Item.Find(itemId).Colors.Add(newColor); // before SaveChanges() 

如果它不爲空,你知道你需要更新(如果本身的顏色發生了變化),或者如離開(如果你只對重新感興趣特徵研)。