实体框架批量更新违反了IsUnique约束

时间:2018-09-20 10:02:41

标签: entity-framework entity-framework-core

这是我们数据库中的几个实体

public class Event 
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    public IList<QuestionEvent> Questions { get; set; }
}

public class QuestionEvent
{
    public Event Event { get; set; }

    public int EventId { get; set; }

    public int Order { get; set; }
}

这是在上下文中定义关系的方式。

builder.Entity<QuestionEvent>().HasIndex(x => new
{
    x.EventId,
    x.Order
}).IsUnique();
builder.Entity<QuestionEvent>().HasOne(x => x.Event).WithMany(x => x.Questions).HasForeignKey(x => x.EventId);
builder.Entity<QuestionEvent>().HasOne(x => x.Question).WithMany(x => x.QuestionEvents).HasForeignKey(x => x.QuestionId);

如果您尝试将Event的值更改为多个QuestionEvents的{​​{1}},则系统将引发循环依赖项错误。

  

2018-09-20 10:32:35.252 +01:00 [ERR]无法保存更改,因为在要保存的数据中检测到循环依赖性:
  'QuestionEvent [修改]
  <-索引{'EventId','Order'} QuestionEvent [已修改]
  <-索引{'EventId','Order'} QuestionEvent [已修改]
  <-索引{'EventId','Order'} QuestionEvent [Modified]'。

这是

猜测,这里发生的是EF由于唯一的约束而无法更新“订单”-如果订单已更改,则在更新过程中,很可能会有两个实体拥有相同的值。

我看不到的是,在不移动该约束的情况下是否有解决该问题的方法。但是,我想把它切成小方块,无论您是尝试将更新作为单个事务,批处理还是将事物包装在事务中(我已经尝试过),我们都会遇到同样的问题。

有没有办法解决这个问题?

1 个答案:

答案 0 :(得分:0)

您可以在一个实体中保存一个虚拟值,更新另一个实体,然后在第一个实体中设置正确的值。可以通过编写一种利用实体的EntityEntry来检查修改后的索引属性的当前值是否等于其他实体的修改后的索引属性的原始值之一的方法来对此进行抽象。