2014-06-11 46 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() 

如果它不为空,你知道你需要更新(如果本身的颜色发生了变化),或者如离开(如果你只对重新感兴趣特征研)。