11

EFは、デフォルトで同時実行制御なし(最後の書き込みが優先)に設定されているため、更新が失われる可能性があります。RowVersion列でConcurrencyMode=Fixedを設定することにより、楽観的同時実行性チェックの実施を明示的に構成できます。

すべてのテーブルのRowVersion列でConcurrencyMode=Fixedの設定を自動化するにはどうすればよいですか?データベースからEFモデルを再作成するときにこれを手動で行う必要があると、同時実行制御なしで実行されていることを忘れるリスクがあります。

4

7 に答える 7

5

この機能は、EF 5 または EF 6 では使用されないようです。

DB First を生成した後、edmx を更新するための簡単なコンソール アプリを作成しました。

edmx ファイルと同じディレクトリにファイルをドロップし、再生成のたびに実行するだけです。

次の列のいずれかで機能します。

RowVersion    timestamp    NOT NULL
rowversion    timestamp    NOT NULL
RowVer        timestamp    NOT NULL
rowver        timestamp    NOT NULL

コンソール アプリはこちらから入手できますhttps://dl.dropbox.com/u/3576345/EFConcurrencyFixed.exe

または、このコードを独自のコンソール アプリで使用します。

class Program
{
    static Dictionary<string, string> replacements = new Dictionary<string, string>()
    {
        { "<Property Type=\"Binary\" Name=\"RowVersion\" Nullable=\"false\" MaxLength=\"8\" FixedLength=\"true\" annotation:StoreGeneratedPattern=\"Computed\" />",
          "<Property Type=\"Binary\" Name=\"RowVersion\" Nullable=\"false\" MaxLength=\"8\" FixedLength=\"true\" annotation:StoreGeneratedPattern=\"Computed\" ConcurrencyMode=\"Fixed\" />"},

        { "<Property Type=\"Binary\" Name=\"rowversion\" Nullable=\"false\" MaxLength=\"8\" FixedLength=\"true\" annotation:StoreGeneratedPattern=\"Computed\" />",
          "<Property Type=\"Binary\" Name=\"rowversion\" Nullable=\"false\" MaxLength=\"8\" FixedLength=\"true\" annotation:StoreGeneratedPattern=\"Computed\" ConcurrencyMode=\"Fixed\" />"},

        { "<Property Type=\"Binary\" Name=\"RowVer\" Nullable=\"false\" MaxLength=\"8\" FixedLength=\"true\" annotation:StoreGeneratedPattern=\"Computed\" />",
          "<Property Type=\"Binary\" Name=\"RowVer\" Nullable=\"false\" MaxLength=\"8\" FixedLength=\"true\" annotation:StoreGeneratedPattern=\"Computed\" ConcurrencyMode=\"Fixed\" />"},

        { "<Property Type=\"Binary\" Name=\"rowver\" Nullable=\"false\" MaxLength=\"8\" FixedLength=\"true\" annotation:StoreGeneratedPattern=\"Computed\" />",
          "<Property Type=\"Binary\" Name=\"rowver\" Nullable=\"false\" MaxLength=\"8\" FixedLength=\"true\" annotation:StoreGeneratedPattern=\"Computed\" ConcurrencyMode=\"Fixed\" />"},
    };

    static void Main(string[] args)
    {
        // find all .edmx
        string directoryPath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
        foreach (var file in Directory.GetFiles(directoryPath))
        {
            // only edmx
            if (!file.EndsWith(".edmx"))
                continue;

            // read file
            var fileContents = System.IO.File.ReadAllText(file);

            // replace lines
            foreach (var item in replacements)
                fileContents = fileContents.Replace(item.Key, item.Value);

            // overwite file
            System.IO.File.WriteAllText(file, fileContents);
        }
    }
}
于 2013-03-27T16:18:14.113 に答える
4

EF6 では、デザイナーは、データベースからモデルを作成するときに、rowversion 列にConcurrencyMode=Fixed を設定します。デザイナー: 行バージョン列に ConcurrencyMode=Fixed を設定する自動化 を参照してください。それまでは手動で行う必要があります。

于 2012-10-18T16:40:21.903 に答える
1

私は自分でそれを行っていませんが (まだ、おそらくすぐに必要になるでしょう)、.edmx からコードを生成するために使用されるツールを変更できるはずです。

これは、 VS2008で説明している記事です。VS2010 と VS2012 のプロセスはほぼ同じになると思います。

ただし、これにより ConcurrencyMode を何らかの方法で操作できるようになるかどうかは、現時点ではわかりません。

于 2012-10-10T12:11:08.117 に答える
0

ConcurrencyMode を手動で設定するのに飽きたので、それを自動化するための小さなユーティリティを作成しました。これを使用して、特定のタイプ (timestamp/rowversion) または特定の正規表現パターンに一致する列名のモードを設定できます。

http://blog.wezeku.com/2014/04/28/fixefconcurrencymodes/

https://github.com/wezeku/FixEFConcurrencyModes

于 2014-04-28T16:02:58.880 に答える