【发布时间】:2015-04-22 16:11:44
【问题描述】:
我有一个具有多对多自我关系的实体。以这个实体为例:
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,目前如果实体上存在并发操作(例如,尝试删除当前未在数据库中退出的朋友)我收到以下错误消息和 DbUpdateException :
保存不公开外键的实体时出错 他们关系的属性。 EntityEntries 属性将 返回 null,因为无法将单个实体标识为源 的例外。可以进行保存时的异常处理 通过在实体类型中公开外键属性更容易。看 InnerException 了解详情。
【问题讨论】:
-
您能否详细说明您拥有什么样的并发访问以及如何发生冲突?例如。您的应用程序内是否只有多个线程在添加/删除,或者您的应用程序外部是否有进程也在更改数据?
-
嗯,基本上是不同的客户端同时更改这些实体。他们可以同时为系统中注册的用户之一添加/删除好友。假设客户端 A 和客户端 B 从用户中删除了同一个朋友。这将导致异常。但是,目前我只得到一个
DBUpdateException而不是一个可以正确处理的OptimisticConcurrencyException。 -
您收到
DBUpdateException的消息了吗?另外,为了清楚起见,您使用的是什么版本的 EF? -
@Asad 请查看我对您要求的信息的编辑。
-
不幸的是,我认为你想要的东西是不可能的。请参阅efreversepoco.codeplex.com/workitem/53,它仍然开放。我认为您必须自己明确管理映射并添加时间戳字段。
标签: c# entity-framework optimistic-concurrency