EntityFramework Index至少插入一个

时间:2017-06-22 11:09:23

标签: c# frameworks constraints entity unique

对于我的问题没有任何更好的标题,但情况非常简单:我有我的数据库(使用代码首次迁移创建),我有我的实体,它有两个具有索引约束的字段所以当这些字段相同时,我无法插入重复的记录。

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对象)?

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

2 个答案:

答案 0 :(得分: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();    

答案 1 :(得分:0)

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

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

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

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