2012-02-15 5 views
4

私は、Entity Frameworkコードを使用している既存のデータベースを最初にマップしています。列の命名規則は奇妙なので、エンティティのプロパティを手動でマップすることにしました。これまではこれまでうまくいきました。Entity Framework 4.1プライマリキーを外部キー列として持つテーブルへのコードの最初のマッピング

データベースのスキーマは私にとってかなり奇妙で、どうしたのかは間違いありません。残念ながら、私はしばらくそれに固執しています。

基本的に、1対1の関係の束を作成する多数のテーブルによって共有される単一の主キー(AccountNumber)があります。ただし、主キーは外部キー列でもあります。ここでは、エンティティの外観を見ていきます(簡単にするためにプロパティの全体が削除されています)。私は簡単にするために2つのエンティティのみを含んでいます。:

public class Customer 
{ 
    public int AccountNumber { get; set; } 
    public String PhoneNumber { get; set; } 
    ... 
    public virtual Address Address { get; set; } 
} 

public class Address 
{ 
    public int AccountNumber { get; set; } 
    public String Name { get; set; } 
    public String Address1 { get; set; } 
    public String City { get; set; } 
    ... 
    public virtual Customer Customer { get; set; } 
} 

2つのエンティティは同じ主キーを共有します。私はこのようなマッピングを行うために設定クラスを作成しました:

public class CustomerConfiguration : EntityTypeConfiguration<Customer> 
{ 
    public CustomerConfiguration() 
     : base() 
    { 
     HasKey(p => p.AccountNumber); 
     Property(p => p.AccountNumber). 
      HasColumnName("cm_l_acct"). 
      IsRequired(); 
     Property(p => p.PhoneNumber). 
      HasColumnName("cm_s_phonenumber"); 

     HasRequired(x => x.Address). 
      WithRequiredPrincipal(x => x.Customer). 
      Map(x => x.MapKey("am_l_acct")); 
    } 
} 
public class AddressConfiguration : EntityTypeConfiguration<Address> 
{ 
    public AddressConfiguration() 
     : base() 
    { 
     HasKey(p => p.AccountNumber); 
     Property(p => p.AccountNumber). 
      HasColumnName("am_l_acct"). 
      IsRequired(); 

     ... 
    } 
} 

外部キーマッピングは、片側のみで行われます。これは、外部キー列がテーブルの主キーでもない場合にはうまくいくように見えます。クエリを実行しようとすると、エラーが発生します。

(256,6):エラー0019:タイプの各プロパティ名は一意である必要があります。プロパティ名 'am_l_acct'は既に定義されています。

残念ながら、主キーであるため、AddressエンティティからAccountNumberプロパティのマッピングを取得できません。

このマッピングを実現する方法はありますか、それとも不可能ですか?

答えて

3

Map(x => x.MapKey("am_l_acct"))Customerマッピングから削除してください。このマッピングは、データベースにFK列を定義したい場合にのみ使用され、クラスにはFKプロパティはありませんが、それを持っています - Addressエンティティの主キーです。 FKをマップすると、EFは同じ名前の列に作成しようとしていると考えます。

+0

うわー、ありがとう。私は今、親切な気分になります。私はそれを試みましたが、私が行ったときにプロパティを仮想に設定していなかったので、Lazy Loadではなく、NullReferenceExceptionが発生しました。今は素晴らしい作品です。 – user1210312

関連する問題