【问题标题】:Updating a many to many relation - Entity framework更新多对多关系 - 实体框架
【发布时间】:2014-06-11 12:40:01
【问题描述】:

我正在使用实体框架来保存多对多关系。 显然,部分关系已经存在于数据库中,它给了我一个重复的 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]

【问题讨论】:

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


    【解决方案1】:

    您要做的是在相关集合中实现类似“插入或更新”的功能。这是不可能的。

    如果您需要使用 EF 执行此类操作,则需要通过加载相关实体来检查数据库中是否存在关系。如果存在,请保持原样并保存更改。如果不存在,则创建它并保存更改。

    例如,您是否在项目和颜色之间存在多对多关系,并且您想在其 Colors 集合中插入或更新颜色,您需要检查该颜色是否已经存在:

     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()
    

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

    【讨论】:

      猜你喜欢
      • 2014-10-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-14
      • 1970-01-01
      • 1970-01-01
      • 2017-01-28
      • 2011-12-17
      相关资源
      最近更新 更多