【问题标题】:EntityFramework Index Insert at least oneEntityFramework Index 插入至少一个
【发布时间】:2017-06-22 11:09:22
【问题描述】:

想不出更好的标题来解决我的问题,但情况非常简单:我有我的数据库(使用代码优先迁移创建),我有我的实体,它有两个具有索引约束的字段,所以我不能当这些字段相同时插入重复记录。

public class Entity
{
    public int Id;

    [Index("IndexName"), IsUnique = true, Order = 0]
    [MaxLength(50)]
    public string Name;

    [Index("IndexName"), IsUnique = true, Order = 1]
    public Guid CustomId;
}

对于一个简短的实体类示例,我做了这个(我看起来有更多的属性、getter、setter ;))

我试着做这个:

<...>
using (var ctx = new EntitiesDbContext())
{
    var e1 = new Entity()
    {
        Name = "Bob",
        CustomId = new Guid("068462F1-3557-E711-BA31-028037EC0200")
    };

    var e2 = new Entity()
    {
        Name = "Bob",
        CustomId = new Guid("068462F1-3557-E711-BA31-028037EC0200")
    };

    ctx.Entities.Add(e1);
    ctx.Entities.Add(e2);


    await ctx.SaveChangesAsync(); // I get exception
}
<...>

一切都很好,因为索引,我无法插入两条记录,但我的问题是,它根本没有插入任何值。是否有可能制造这种情况,向 DB(即 e1 对象)添加至少一个值?

附:问题来自更复杂的情况,我的示例非常明显或愚蠢,但它显示了我想要实现的想法。问题是我猜的系统性能问题,当两条记录被插入到上下文中,然后当我在上下文中尝试保存它时,我得到了一个异常。

【问题讨论】:

    标签: c# frameworks constraints entity unique


    【解决方案1】:

    在所有版本的 Entity Framework 中,无论何时执行 SaveChanges() 在数据库上插入、更新或删除 框架会将该操作包装在一个事务中。

    来源:https://msdn.microsoft.com/en-us/library/dn456843(v=vs.113).aspx

    因此您必须单独保存每个项目,因为事务的行为是在发生错误时不对数据库进行任何更改。

    ctx.Entities.Add(e1);
    ctx.SaveChanges();
    
    ctx.Entities.Add(e2);
    ctx.SaveChanges();    
    

    【讨论】:

    • 谢谢你回复@fubo 我写了一个答案我是如何解决我的问题的。
    【解决方案2】:

    我发现有趣的是,我可以检查 ctx.ChangesTracker 对象以获取已更改的实体列表。

    所以我只是简单地检查了更改计数,例如,如果计数为 2,我将这些实体状态设置为未更改。

    ctx.ChangeTracker.Entries().First().State = EntityState.Unchanged
    

    这解决了我处理了几个小时的问题和痛苦。

    【讨论】:

      猜你喜欢
      • 2022-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多