私は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として文字列を使用できないのは本当にですか?
または、それを行う方法はありますか?
これは、Identity Autoincrementを有効にせずにPKを作成する適切な方法です。
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public string FooId { get; set; }
主キーを文字列にする必要がある場合は、ID列にしないでください。 ID列は主キー値を生成しますが、自分で値を生成する場合はオフにする必要があります。
主キーとして文字列を使用する理由は何ですか?
主キーを自動インクリメント整数フィールドに設定し、文字列フィールドにインデックスを配置するだけです。
そうすれば、テーブル上で検索を行う場合、それらは比較的高速になり、すべての結合と通常のルックアップは速度に影響しません。
インデックスを作成する文字列フィールドの量を制御することもできます。つまり、十分だと思う場合は、「最初の5文字のみをインデックス化する」と言うことができます。または、データが比較的似ている場合は、フィールド全体にインデックスを付けることができます。