4

主キーの使用に関する問題を解決するために、すでに数日苦労しています。誰かこのパズルを解くのを手伝ってください!!!

Code First アプローチを使用して CTP4 で Entity Framework を使用しています。私のプロジェクトでは、Huyrua によって公開されたリポジトリ パターンを採用しました。ここを参照してください。私はこのパターン、特に CTP4 の可能性に非常に興奮しています。

エンティティの定義には、いくつかのネスト レイヤーを使用します。一番下には、次のようないくつかの一般的なフィールドを含む BaseEntity があります。

public abstract class BaseEntity: IEntityBase
    {
        public virtual Nullable<System.DateTime> InsertDate { get; set; }
        public virtual Nullable<int> PK_InsertUserAccount { get; set; }
        public virtual byte[] TimeStamp { get; set; }
    }

次に、このクラスから具体的なエンティティを派生させます。次に例を示します。

public class Person : BaseEntity
    {
        public virtual int PK_Person { get; set; }
        public virtual byte PersType { get; set; }
        public virtual string eMail { get; set; }
        public virtual string Name { get; set; }
    }

ノート!主な違いが 1 つあります。DB テーブルの主キー名は「Id」ではありません。パターン PK_ を使用しています。このため、BaseEntity に PK フィールド定義を含めません。さらに、 use を使用EntityConfigurationして、慣習にとらわれない主キーをマップします。

public class PersonMapping : EntityConfiguration<Person>
    {
        public PersonMapping()
        {
            this.HasKey(p => p.PK_Person);
            this.Property(p => p.PK_Person).IsIdentity();
            this.MapSingleType().ToTable("dbo.Person"); //otherwise by convention it is  converted to "People"
        }
    }

ここで問題があります。Person エンティティを使用しようとすると、「エンティティ タイプ 'KDC.Model.Entities.BaseEntity' のキーを推論できません」というエラーが表示されます。ObjectContext は、基本クラスで主キーを定義する必要があるようです。実験目的で BaseEntity の PK フィールド定義を移動すると、すべてが正常に機能したためです。しかし、私たちの場合、これは不可能です。なぜなら、テーブルごとに異なる主キー フィールド名があるからです。

どこが間違っているのかわからない!私を助けてください!!!

4

1 に答える 1

1

MapSingleType を使用する代わりに、MapHierarchy を使用してフィールドを指定してみてください。

例えば

modelBuilder.Entity<Person>().MapHierarchy(p => new { p.PK_Person, p.PersType, p.Name, p.eMail, p.InsertDate, p.PK_InsertUserAccount, p.TimeStamp}).ToTable("Persons");
于 2010-10-10T17:29:17.457 に答える