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();
答
我发现有趣的是,我可以检查ctx.ChangesTracker对象以获取已更改的实体列表。
所以我只是做了简单的检查更改计数,如果计数是2例如,我使这些实体状态为不变。
ctx.ChangeTracker.Entries().First().State = EntityState.Unchanged
这解决了我的问题和痛苦,我正在处理几个小时。
感谢您的回复@fubo我写了一个答案,我是如何解决我的问题的。 – GrandaS