7

EntityFramework匿名の複合キーのプロパティ名の競合

私はすでに正しいDbSetsを設定していると、オブジェクトが相互に適切な参照が含まれています。これは私にとっては新しいことではなく、物事はうまくいっています。

ここでは、時にはテーブル(またはこの場合はオブジェクト)の外部キーを含む複合キーがあります。このためには、DbContextのOnModelCreatingメソッドでHasKey<>()関数を使用します。これらのプロパティの名前が異なる場合は問題ありませんが、これらのプロパティの名前が同じ場合は移行できません。

例:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     // ... 

     modelBuilder.Entity<PatientVisit>().ToTable("PatientVisits"); 
     modelBuilder.Entity<PatientVisit>().HasKey(x => 
      new { x.Patient.Code, x.Code }); 

     // ... 

     base.OnModelCreating(modelBuilder); 
    } 

あなたが提供するコードで見ることができるように、オブジェクトPatientVisitは、コードという名前のプロパティを持っていますが、このプロパティには、限り、それが異なる患者で繰り返されるように繰り返すことができます。エンティティPatientには、キー定義された名前付きコードもあります。

匿名型には、同じ名前を推測する2つのプロパティ(明白)を使用できません。典型的なソリューションは、このような匿名型のプロパティに名前を付けるために、次のようになります。

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     // ... 

     modelBuilder.Entity<PatientVisit>().ToTable("PatientVisits"); 
     modelBuilder.Entity<PatientVisit>().HasKey(x => 
      new { PatientCode = x.Patient.Code, VisitCode = x.Code }); 

     // ... 

     base.OnModelCreating(modelBuilder); 
    } 

しかし、これをやって、私はこのエラーメッセージがスローされた移行を追加してみてください。私はあなたがここで何をする必要があるかと思います

The properties expression 'x => new <>f__AnonymousType3`2(PatientCode 
= x.Patient.Code, VisitCode = x.Code)' is not valid. The expression 
should represent a property: C#: 't => t.MyProperty' VB.Net: 'Function(t) 
t.MyProperty'. When specifying multiple properties use an anonymous 
type: C#: 't => new { t.MyProperty1, t.MyProperty2 }' 
VB.Net: 'Function(t) New With { t.MyProperty1, t.MyProperty2 }'. 

答えて

0

PatientVisitに新しいプロパティPatientCodeを与えることです。それはPatientへの外部キーになります。あなたは

modelBuilder.Entity<PatientVisit>().HasKey(x => 
     new { x.PatientCode, x.Code }); 
+1

を行うことができます例えば

HasRequired<PatientVisit>(v => v.Patient).WithMany() .HasForeignKey(v => v.PatientCode) 

は、次に私が参照しているオブジェクトの手動キーとIDを追加するために私を必要とするソリューションがあります知っているが、それはデータベースに単純なオブジェクトモデルを「変更」を意味しますマッピングモデル、私はそれをしないことを好む。 –

+0

あなたのソリューションは、私が実装したものと似ていますが、DataAnnotationsによって実行されるため、フルエントマッピングが必要ないということだけです。基本的には、 'ForeignKey'属性を使用して宣言されたプロパティを仮想ナビゲーションプロパティの外部キーにアタッチしますが、それでも_iがナビゲーションプロパティ_and_アンカーまたは外部キーのプロパティを明示的に定義する必要があることを意味します。私は、データベースに関連する重要なプロパティがなく、すっきりとしたきれいなオブジェクトモデルを作りたいと思っています。 –

+0

私が参照している_current-but-not-wanted_解決策の例については、[this thread](http://stackoverflow.com/questions/5388077/primary-foreign-key-inentity-framework)を参照してください。それは非常によく説明されています。 –

関連する問題