对于我的问题没有任何更好的标题,但情况非常简单:我有我的数据库(使用代码首次迁移创建),我有我的实体,它有两个具有索引约束的字段所以当这些字段相同时,我无法插入重复的记录。
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。问题来自更复杂的情况,我的例子非常明显或愚蠢,但它显示了我想要实现的想法。问题是系统性能我猜,当两个记录被插入到上下文中然后当我上下文试图保存它时,我得到了一个例外。
答案 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
这解决了我在几个小时内处理的问题和痛苦。