web-dev-qa-db-ja.com

Entity Frameworkで文字列プロパティを主キーとして使用する方法

私はEFの初心者であり、ETF6.0のコードファーストアプローチで最初のステップを実行しようとしましたが、今は問題があります。

私は財産を持っています

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

これがモデルの主キーです。

しかし、私が実行した場合

PM>更新データベース

データベースへの保留中の移行を更新するパッケージマネージャーコンソールのコマンドは、次のエラーが表示されます。

ID列 'FooId'は、データ型int、bigint、smallint、tinyint、またはスケールが0の10進数または数値であり、null不可に制約されている必要があります。

モデルのPKを

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

すべてが正常に動作します。

しかし、私の場合は絶対に意味があるので、PKは文字列型である必要があります。欠点があることは知っていますが、私には必要です。

私はここで古い投稿を見ました エンティティフレームワークで主キーとして文字列を作成する方法!

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

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

または、それを行う方法はありますか?

20
ck84vi

これは、Identity Autoincrementを有効にせずにPKを作成する適切な方法です。

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

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

2
Bill Ravdin

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

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

そうすれば、テーブル上で検索を行う場合、それらは比較的高速になり、すべての結合と通常のルックアップは速度に影響しません。

インデックスを作成する文字列フィールドの量を制御することもできます。つまり、十分だと思う場合は、「最初の5文字のみをインデックス化する」と言うことができます。または、データが比較的似ている場合は、フィールド全体にインデックスを付けることができます。

1
Rakin