質問: 私はベースのエンティティクラスを持っています。 `GetById`継承できるように、異なるエンティティ固有のリポジトリのための`GetById`メソッドを1 `GetById`書くだけです。ただし、データベーステーブルの「Id」列は、従来の理由から「コード」と呼ばれる必要があります。 私はしようとした(簡体字版): ``` public class EntityBase{ int Id; } public class IdEntity : EntityBase{ } public class CodeEntity : EntityBase{ } ``` そして、DbContextで: ``` modelBuilder.Entity(entity => { entity.HasKey(e=>e.Id).HasName("PK_IdEntity"); entity.Property(e=>e.Id).HasColumnName("ID"); } modelBuilder.Entity(entity => { entity.HasKey(e=>e.Id).HasName("PK_CodeEntity"); entity.Property(e=>e.Id).HasColumnName("Code"); //this seems to be where it breaks } ``` これはうまくいきますが、実行しようとすると、InvalidOperationExceptionが発生します。エンティティタイプ 'CodeEntity'のプロパティ 'Id'のプロパティを呼び出すことができません。これはナビゲーションプロパティとして設定されているためです。プロパティはスカラープロパティの設定にのみ使用できます。 私がしようとしていることは不可能ですか?それは私にはありそうもないようですが、それを行う正しい方法は何でしょうか? ### 編集: 私が実際にやろうとしていたことは、私がここに投稿した "単純化された"コードよりもはるかに複雑であることが分かりました。私は文字列またはint型のIDを持つことができ、同じ`GetById`メソッドを使用できるようにしたいと思っていました。だから、私はEntity Frameworkのために大丈夫と思っていたstringとintの両方への暗黙的な変換を持つクラスを作成しました。 そうではありません。 実行時エラーは、 `EntityID`タイプのプロパティが自分のキーでなければならないことをEFに伝えようとしたために発生しました。 私はEntity Frameworkのキー値の要件についてMicrosoftから文書を見つけることができませんでしたが、スカラーとバイト]のみがキーに許可されているという別の問題を発見しました[。Entity Frameworkモデル
回答: コードを修正しようと思っても十分に上手くいっていたので、私はコンパイルするコードの上に乗ったり例外を与えたりできませんでした。あなたが達成しようとしているシナリオをどのように書くかを記述します。 EFでPKプロパティとして`EntityBase.Id`を使用する場合は、パブリックプロパティにする必要があります。あなたのコードでは、それはプライベートフィールドです(get / setメソッドがないため)。したがって、 `EntityBase`クラスは次のようになります ``` public class EntityBase { public int Id { get; set; } } ``` 上記の変更と、問題の投稿されたエンティティタイプをマップする`OnModelCreating`コードを使用すると、モデル構築は、 `OnModelCreating`なテーブル構造と名前のテーブルを正しく作成して動作します。 以下は、 `GetById`で一般的な`GetById`を実装する小さなメソッドです。汎用リポジトリや拡張メソッドの一部にすることができます。 ``` public static T GetById(DbSet dbset, int id) where T : EntityBase { return dbset.FirstOrDefault(e => e.Id == id); } // example var entity = GetById(db.Set(), 2); ```