2011-07-18 17 views
2

)コードファーストを使用して送受信メッセージとその中のレコードをモデル化するTPC継承を設定しようとしています。 基本型SentRecordは具体的なものであり、派生型ReceivedRecordも具体的であり、SentRecordから継承し、いくつかのフィールドを追加して戻りコードを記録します。このような何かは、より多くのプロパティを持つ:コードの最初のTPC具体的なベースとコンクリートタイプの継承(

public class SentRecord : RecordBase { 
    public int Id { get; set; } 
    public string FooField { get; set; } 
} 

public class ReceivedRecord : SentRecord { 
    public int ReturnCode { get; set; } 
    public SentRecord SentRecord { get; set; } 
} 

現在のモデルは、TPHあり、その結果、テーブルは持続したオブジェクトの種類を識別するためのdescriminator列を取得します。それは動作しますが、私は両方のオブジェクトが別のテーブルに格納されることを望んでいますが、ディスクリミネータカラムは必要ありません。テーブルSentRecordにはId列とFooField列のみがあり、テーブルReceivedRecordにはId、FooField、ReturnCode、FK to SentRecordがあります。

私は現在、私のDataContextクラスで、次があります。

public class Context : DContext { 
    public DbSet<SentRecord> SentRecords { get; set; } 
    public DbSet<ReceivedRecord> ReceivedRecords { get; set; } 
} 

そして私は、次のReceivedRecordのための設定があります。

public class ReceivedRecord_Configuration : EntityTypeConfiguration<ReceivedRecord>{ 
    public ReceivedRecord_Configuration() { 
     this.Map(m => { 
      m.MapInheritedProperties(); 
      m.ToTable("ReceivedRecords"); 
     }); 
    } 
} 

そしてSentRecordために、次の

public class SentRecord_Configuration : EntityTypeConfiguration<SentRecord>{ 
    public SentRecord_Configuration() { 
     this.Map(m => { 
      m.MapInheritedProperties(); //In order to map the properties declared in RecordBase 
      m.ToTable("SentRecords"); 
     }); 
    } 
} 

一度これを実行すると、EFが初期化しようとしているときに次のエラーが発生します私のデータベース:

Problem in mapping fragments starting at lines 455, 1284: 
An entity from one EntitySet is mapped to a row that is also mapped to an entity from another EntitySet with possibly different key. 
Ensure these two mapping fragments do not map two unrelated EntitySets to two overlapping groups of rows. 

私は上記のTPC方法でこれを設定するために何をすべきか分かりませんか?それとも、私はTPHを使うべきですか?

ありがとうございます!

答えて

1

さて、私はそれを稼働させています。実際に私が与えた例は、私が実際に使っていたクラスと継承の階層より少し複雑ではありませんでした。その階層には、多くの抽象クラスと、他のクラスが継承した具象クラスが含まれていました。

継承を切り詰めることで階層を「平坦化」することで、スムーズに、エラーなく実行できます。応答メッセージは送信されたメッセージから継承されません。

短いバージョン:コードファーストデータベースモデルを使用しようとすると、コンクリートと抽象基底型が混在する複雑な継承ツリーを作成しないでください。永続化するのはより複雑になります。

関連する問題