c# - Entity Framework 多对多自关联与乐观并发控制

标签 c# entity-framework optimistic-concurrency

我有一个具有多对多 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/

相关文章:

c# - C#:并行形式,多线程和 “applications in application”

c# - LINQ表达式无法翻译。以可以翻译的形式重写查询,或切换到客户端评估EF Core 3.1

javascript - 轻松解决冲突

RESTful API 和批量操作

c# - AcceptAllChanges 导致 Entity Framework ... 不接受更改?

c# - Insight.Database 列映射到对象

c# - Linq 查询转换为 List<string>

c# - 持久化对象时自动创建对象历史记录

entity-framework - 使用 TextTransform.exe 从 edmx 文件生成代码

.net - 使用 Microsoft.WindowsAzure.StorageClient.TableServicesContext 并检测并发更新冲突