我在使用实体框架6.实体框架与过滤指数 - “无法插入重复键行对象”
CREATE TABLE [dbo].[ItemImage](
[ItemId] [int] NOT NULL,
[stream_id] [uniqueidentifier] ROWGUIDCOL NOT NULL,
[Primary] [bit] NOT NULL,
[Caption] [nvarchar](1000) NULL,
CONSTRAINT [PK_ItemImage_ItemId_stream_id] PRIMARY KEY CLUSTERED ([ItemId] ASC, [stream_id] ASC)
CONSTRAINT [FK_ItemImage_ItemId_Item] FOREIGN KEY([ItemId]) REFERENCES [dbo].[Item] ([ItemId])
);
GO
CREATE UNIQUE NONCLUSTERED INDEX [UXF_ItemImage_ItemId_Primary]
ON [dbo].[ItemImage] ([ItemId] ASC)
WHERE ([Primary] = 1);
GO
背后的MVC的Web应用程序位于数据库以下简化表定义和过滤唯一索引
唯一索引可防止设置[Primary]
位标志的多个[ItemId]
。
在MVC控制器,我有ItemImage
,我有如下更新EF模型视图模型的集合:
...
foreach (var img in itemViewModel.ItemImages)
{
var itemImage = item.ItemImages.First(i => i.stream_id == img.stream_id);
itemImage.Primary = img.Primary;
itemImage.Caption = img.Caption;
}
...
await db.SaveChangesAsync();
当db.SaveChangesAsync()
叫我出现以下情况例外:
无法在具有唯一索引'UXF_ItemImage_ItemId_Primary'的对象'dbo.ItemImage'中插入重复键行。重复的键值是(146)。 该声明已被终止。
我有逻辑,其防止一个具有多个Item
“初级” ItemImages
的更新之前。
我认为这是因为当实体框架试图更新数据库中的ItemImages集合时,它将另一行的[Primary]
标志设置为1
,然后取消设置当前设置的行。
有没有办法强制在实体框架更新的顺序?或者是否有我可以实施的解决方法?
这个貌似正确的做法,据我所知,你无法控制的顺序命令。如果出现其他问题,我会将这一切全部包装在一个事务中(使用'db.Database.BeginTransaction()')来防止一半的更新 – Jcl
谢谢,这是一个很好的观点! –