更新多对多关系 - 实体框架

时间:2014-06-11 12:40:02

标签: sql-server entity-framework c#-4.0

我正在使用实体框架以保存多对多的关系。 显然,部分关系已经在数据库中存在,它给了我一个重复的KEY错误。

如何在Insert上实现实体框架覆盖?

我的错误:

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]

1 个答案:

答案 0 :(得分: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()

如果它不为空,你知道你必须更新它(如果颜色本身已经改变),或保持原样(如果你只对这种关系感兴趣)。