2015-10-07 7 views
17

私はEFで新しく、ETF6.0でコードの最初のアプローチで私の最初のステップを実行しようとしていますが、今は問題があります。Entity FrameworkでStringプロパティを主キーとして使用する方法

私はモデルのための私の主キーであるプロパティ

[Key] 
public string FooId { get; set; } 

を持っています。

しかし、私は次のエラーを取得するデータベースへの移行を保留更新するために、パッケージマネージャコンソールで

PM> Update-Database

コマンドを実行する場合:私は私のモデルでPKを変更する場合は

Identity column 'FooId' must be of data type int, bigint, smallint, tinyint, or decimal or numeric with a scale of 0, and constrained to be nonnullable.

[Key] 
public int FooId { get; set; } 

すべて正常です。

しかし、私のケースでは絶対的な感覚を与えるので、私はPK型が文字列である必要があります。私には欠点があることは分かっていますが、私にとっては必要です。

私は古いポストをここに見ましたHow to make string as primary key in entity framework!

しかし、それは私の問題を解決していないか、私はそれを理解していないようです。

SQLデータベースで文字列をPKとして使用できないのは本当ですか?

これを行う方法はありますか?

+0

を鍵がアイデンティティにデフォルト設定されているので、あなたは属性によってそれをオフにする必要があります[DatabaseGenerated(DatabaseGeneratedOption.None)]つまり、追加するときに手動でキーを指定する必要があります(生成されません)。 – Hopeless

答えて

29

これが有効になっアイデンティティ自動インクリメントせずにPKを作成するための適切な方法である: `

[Key] 
[DatabaseGenerated(DatabaseGeneratedOption.None)] 
public string FooId { get; set; } 
2

主キーが文字列である必要がある場合は、それをID列にしないでください。 ID列では主キー値が生成されますが、値を自分で生成する場合はオフにする必要があります。

1

文字列を主キーとして使用する理由は何ですか?

私は、主キーを自動インクリメント整数フィールドに設定し、文字列フィールドにインデックスを付けるだけです。

このようにすれば、テーブルで検索すると、それらは比較的高速でなければならず、すべての結合と通常のルックアップは速度に影響を受けません。

インデックスを取得する文字列フィールドの量を制御することもできます。言い換えれば、それが十分であると思うなら、「最初の5文字のみをインデックスする」と言うことができます。また、データが比較的似ている場合は、フィールド全体をインデックスすることができます。

+0

彼の推論は私のものと同じだと思います:コンテキストオブジェクトを.Find(fooId)して、エンティティフレームワークの第1レベルのキャッシュを適用することができます 私はusername –

関連する問題