问题描述
|
我正在使用Entity Framework,而我的部分代码想将100个实体放入数据库中。我要插入的某些实体具有多对多关系,因此我想确保只插入新项目。可以很容易地检查数据库中的现有项目,但是如果我已经在当前会话中插入了该项目以保留100个项目,那么我将得到重复的项目。
事情是主键只是自动生成的,并且表的唯一性来自于EF不支持的唯一列。如何检查是否尚未在EF 4.1中插入会话的项目部分?我在DbContext上看到了find方法,但这需要我不能使用的主键。鉴于我使用的是4.1,所以我也仍然停留在DBContext上。我该如何检查呢?
解决方法
如果要使用EF,则应坚持使用PK作为实体的唯一标识。否则,您的开发经验将非常糟糕。
如果要检查在当前上下文中是否已经处理了相同的项目,请使用:
bool exists = context.YourDbSet.Local.Any(x => x.UniqueId == someId)
如果需要检查实体的状态,请使用:
EntityState state = context.Entry(entity).State;
如果需要检查实体是否存在于数据库中,请使用:
YourEntity entity = context.YourDbSet.SingleOrDefault(x => x.UniqueId == someId);
最后一条语句实际上并不是并发系统中的最佳方法,因为当您调用它时,该实体不必存在,但是一旦调用“ 3”,其他进程可能已经插入了该实体。没有简单的方法来处理它。