EF默认为无并发控制(最后一次写入获胜),这会导致更新丢失。
可以通过在RowVersion列上设置ConcurrencyMode = Fixed来显式配置执行开放式并发检查。
如何在所有表的RowVersion列上自动设置ConcurrencyMode = Fixed?
从数据库重新创建EF模型时,必须手动执行此操作,否则我们可能会忘记其没有并发控制的运行状态。
最佳答案
这类似于Mohamed Cassim的答案,但是我已经更新了代码以使用XML属性搜索和替换,而不是字符串替换,因为设计者可以更改属性的顺序,或者其他属性可以具有不同的值。
将其另存为FixVersionColumnConcurrencyMode.cs
,运行csc FixVersionColumnConcurrencyMode.cs
,然后在与.edmx文件相同的文件夹中运行生成的FixVersionColumnConcurrencyMode.exe。您还可以使其执行项目的后期构建。
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Xml.Linq;
namespace Utility
{
internal class FixVersionColumnConcurrencyMode
{
private static void Main(string[] args)
{
string directoryPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
var files = Directory.GetFiles(directoryPath, "*.edmx");
foreach (var file in files)
{
XDocument xmlDoc = XDocument.Load(file);
IEnumerable<XElement> versionColumns =
from el in xmlDoc.Descendants()
where (string)el.Attribute("Name") == "Version"
&& (string)el.Attribute("Type") == "Binary"
&& (string)el.Attribute("ConcurrencyMode") != "Fixed"
select el;
bool modified = false;
foreach (XElement el in versionColumns)
{
modified = true;
el.SetAttributeValue("ConcurrencyMode", "Fixed");
}
if (modified)
xmlDoc.Save(file);
}
}
}
}
关于entity-framework - 如何自动在所有RowVersion列上设置ConcurrencyMode = Fixed?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12732161/