EntityFramework Index插入至少一个

EntityFramework Index插入至少一个

问题描述:

想不到任何更好的标题为我的问题,但情况非常简单:我有我的数据库(使用代码第一次迁移创建),我有我的实体,它有两个字段有索引限制,所以当这些字段相同时,我不能插入重复记录。EntityFramework Index插入至少一个

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 
} 
<...> 

一切都很好,由于索引我不能插入两条记录,但我的问题是,它根本没有插入任何值。是否有可能造成这种情况,为数据库添加至少一个值(即e1对象)?

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

在实体框架的所有版本,当你执行 的SaveChanges()来插入,更新或删除数据库中的 框架将包裹在交易该操作。

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

所以,你必须seperatly节省每一个项目,因为交易的行为是没有做更改数据库中的错误的情况下。

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

ctx.Entities.Add(e2); 
ctx.SaveChanges();  
+0

感谢您的回复@fubo我写了一个答案,我是如何解决我的问题的。 – GrandaS

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

所以我只是做了简单的检查更改计数,如果计数是2例如,我使这些实体状态为不变。

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

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