サーバー生成キーとサーバー生成値は、SQL Server Compactではサポートされていません。

compact-framework entity-framework

質問

エンティティフレームワークを使い始めたばかりなので、既存のSQL Server CEデータベースに接続することにしました。 IDENTITY(1、1)主キーを持つテーブルがありますが、エンティティを追加しようとすると、上記のエラーが発生します。

MS Technet articeから私はそれを学びました

SQL Server Compactは、Entity Frameworkと一緒に使用した場合、サーバー生成のキーまたは値を持つエンティティをサポートしません。 Entity Frameworkを使用する場合、エンティティのキーはサーバー生成としてマークされることがあります。これにより、データベースは挿入時またはエンティティ作成時にキーの値を生成できます。さらに、エンティティの0個以上のプロパティがサーバー生成値としてマークされることがあります。詳細については、Entity Frameworkのドキュメントの「Store Generated Pattern」トピックを参照してください。 Entity Frameworkでは、サーバー生成のキーまたは値を使用してエンティティタイプを定義することはできますが、SQL Server Compactは、Entity Frameworkと共に使用する場合、サーバー生成のキーまたは値を持つエンティティをサポートしません。サーバー生成値を持つエンティティに対するデータ操作操作で、 "サポートされていない"例外がスローされます。

だから今私はいくつかの質問があります:

  • もしそれがサポートされておらず、例外を投げられるのであれば、なぜあなたはkeyをserver-generatedとしてマークするのでしょうか?引用された段落から意味を理解するのは難しいです。
  • StoreGeneratedPattern = "Identity"を私のエンティティのプロパティに追加しようとしたとき、Studioはそれが許可されていないと訴えました。何が悪いの?
  • この制限に対する最善の回避策は何ですか(別のDBへの切り替えを含む)。私の制限は、インストールがゼロでエンティティフレームワークを使用することです。

受け入れられた回答

この制限に遭遇したとき、タイプをuniqueidentifierに変更しました


人気のある回答

uniqueidentifierを使用するか、手動でbigint / intキー値を生成するのが最善の選択です。

このような何か...

    private static object lockObject = new object();

    private static long nextID = -1;

    public static long GetNextID()
    {
        lock (lockObject)
        {
            if (nextID == -1) nextID = DateTime.UtcNow.Ticks; else nextID++;
            return nextID;
        }
    }

これは、アプリケーションの実行中にティックごとに複数のレコードを生成しないことを前提としています(さらに停止して再起動するまでの時間)。これは私が信じる合理的な仮定ですが、あなたが完全に防弾(しかしより複雑な)解決策を望むならば、データベースから最も高いIDを読んで、そしてそれから増加してください。



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ