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/

10-12 03:17