我有一个具有多对多 self 关系的实体。作为一个例子考虑这个实体:
public class User
{
public int ID { get; set; }
public string UserName { get; set; }
public virtual ICollection<User> Friends { get; set; }
}
这是我配置映射的方式:
HasMany(t => t.Friends).WithMany()
.Map(m => {
m.MapLeftKey("UserID");
m.MapRightKey("FriendID");
m.ToTable("UserFriends");
});
由于这种关系现在由 EF 管理,我实际上无法访问我代码中的 UserFriends
DbSet
并且无法处理对它的并发访问。
为了让这个组合处理并发访问(添加/删除),我需要自己处理多对多关系然后添加一个 [Timestamp]
列还是有办法告诉EF自己同时处理这个问题吗?就像模型构建器中的配置一样。
编辑:我正在使用 EF 6,目前如果实体上有并发操作(例如,试图删除当前不存在于数据库中的 friend ),我会收到以下错误消息和 DbUpdateException
:
An error occurred while saving entities that do not expose foreign key properties for their relationships. The EntityEntries property will return null because a single entity cannot be identified as the source of the exception. Handling of exceptions while saving can be made easier by exposing foreign key properties in your entity types. See the InnerException for details.
最佳答案
乐观并发在这里不适用。
联结表永远不会更新。它的记录被添加或删除。这意味着没有需要行版本的 CRUD 操作。
所以实际上,并发是相当容易的:
- 两个并发用户不能添加相同的关联,因为最后一个会遇到唯一键冲突。
- 两个并发用户不能删除同一个关联,因为最后一个用户会看到一个异常,即意外数量的记录 (0) 受到影响。
- 至于外键问题(添加/删除与同时删除的实体的关联)。这些也会引发异常。
所以它归结为处理异常并将它们转化为可理解的用户反馈。在更新(和乐观并发)确实起作用的情况下,还必须处理所有这些情况。
关于c# - Entity Framework 多对多自关联与乐观并发控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29803279/