我正在使用实体框架以保存多对多的关系。 显然,部分关系已经在数据库中存在,它给了我一个重复的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]
答案 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);
如果color
是null
,您知道必须插入颜色:
Item.Find(itemId).Colors.Add(newColor); // before SaveChanges()
如果它不为空,你知道你必须更新它(如果颜色本身已经改变),或保持原样(如果你只对这种关系感兴趣)。