我有一个UI线程,可以让用户设置实体的某些属性。
我还有工作线程,它会自动修改实体的属性,重要的是,用户无权访问。
每个线程有不同的DbContexts
是否安全并且仅依赖于我的编程以始终避免修改相同的属性,然后尝试在具有相同实体修改的上下文中SaveChanges()
方式?
或者是否有更安全的方法来实现这一点,即程序员有朝一日可以更改代码以便安全地从两个不同的上下文修改相同属性的方式?或者后一种情况只是程序员必须小心/重构的情况?
答案 0 :(得分:2)
多线程环境中有three ways to resolve the concurrency issues:
locks
轻松完成此操作 - 没有其他人可以编辑已编辑的项目。这是非常难以实现的方法,这种方式在性能视图中非常糟糕 - 所有编辑线程都在等待单个编写器,并且只是浪费系统资源。lock
某些操作,而不是全部操作,则会使用这种方式。实体框架作者鼓励您在应用中使用乐观的方式。 The simple use-case是将RowVersion
或类似名称的属性添加到模型中,并在DBUpdatedException
期间捕获UPDATE
。
您可以使用Code-First
解决方案,如下所示:
[Timestamp]
public byte[] RowVersion { get; set; }
或Database-First
解决方案(使用数据库编辑器添加列):
之后,您的简单案例代码将如下:
using (var context = new SchoolDBEntities())
{
try
{
context.Entry(student1WithUser2).State = EntityState.Modified;
context.SaveChanges();
}
catch (DbUpdateConcurrencyException ex)
{
Console.WriteLine("Optimistic Concurrency exception occured");
}
}
据我所知,您必须检查数据源的某些属性,因此我建议您阅读a great article regarding such use-cases(它是关于MVC应用程序,但我确信您可以管理主要主意)。
您还可以在MSDN上的Entity Framework中找到几篇关于并发性的文章:
DbPropertyValues
访问复杂属性正如您所看到的,这种情况完全依赖于开发人员方面,并且您可以选择大量模式来自行解决并发问题。