2016-09-08 11 views
0

私は大いに地獄になりましたが、完全に得ることができませんでした。here私は有用な情報はほとんど見つけられませんでしたが、成功することはありませんでした。以下は私の質問ですEntity Framework 5の1対1/1対1対多の関係の両方

私は以下のクラスを持ち、エンティティモデルでリレーションを指定する方法が必要です。

public class User 
{ 
    [Key] 
    public int UserId { get; set; } 
    public int? HomeAddressId { get; set; } 

    public virtual ICollection<Address> Addresses { get; set; } 
    public virtual Address HomeAddress{ get; set; } 
} 
public class Address 
{ 
    [Key] 
    public int AddressId { get; set; } 
    public int UserId { get; set; } 
    public string AddressLine1 { get; set; } 

    // other properties 
    public virtual User User { get; set; } 
} 

各ユーザーは多数のアドレスを持ち、各アドレスは1人のユーザー(1対多)に関連付けられています。 アドレスの1つがホームアドレスであるため、ユーザにはHomeAddres(オプション)があります。 HomeAddressIdはFK(nullable)to Addressテーブルです。最初に好ましくはFluent APIメソッドでエンティティモデルコードでこの関係を定義するにはどうすればよいですか?

+0

あなたのコードをコピーしてここに貼り付けた場合、間違った定義があります。ユーザーのアドレスはありません。私はそれを変えた。 このコードは機能します。ただし、モデルを変更することができます。アドレスはすべてのアドレスを収集します。アドレスのAddresTypeメンバーとしてタイプ別にアドレスを区切ることができます。 –

答えて

0

私はコードを簡単に表示することを好みます。

public class User 
    { 
     [Key] 
     public int UserId { get; set; } 
     public int? HomeAddressId { get; set; } 

     public virtual ICollection<Address> Addresses { get; set; } 
     public Address HomeAddress { 
      get { 
       if(Addresses != null) 
        return Addresses.FirstOrDefault(p=> p.AddressType.Home); 
       return null; 
      } 
     } 
    } 
    public enum AddressType 
    { 
     Unknown, 
     Home, 
     Office 
    } 
public class Address 
{ 
    [Key] 
    public int AddressId { get; set; } 
    public int UserId { get; set; } 
    public string AddressLine1 { get; set; } 
    public AddressType AddressType {get; set; } 

    // other properties 
    public virtual User User { get; set; } 
} 

流暢。

public class User 
{ 
    public int UserId { get; set; } 
    public virtual Address HomeAddress { get; set; } 
    public virtual int? HomeAddressId { get; set; } 
    public virtual ICollection<Address> OfficeAddresses { get; set; } 
} 

public class Address 
{ 
    public int AddressId { get; set; } 
    public string AddressLine1 { get; set; } 
} 

public class UserMap : MapEntityTypeConfiguration<User> 
{ 
    public UserMap() 
    { 
     //Other definitions PK etc... 

     this.HasOptional(o => o.HomeAddress) 
       .WithMany() 
       .HasForeignKey(a => a.HomeAddressId); 

     this.HasMany(t => t.OfficeAddresses) 
      .WithMany() 
      .Map(m => 
      { 
       m.ToTable("UserOfficeAddresses"); 
       m.MapLeftKey("AddressId"); 
       m.MapRightKey("UserId"); 
      }); 
    } 
} 
//and define Address Configurations.. MapEntityTypeConfiguration<Address> 
+0

これはおそらく質問を解決しますが、自分のアプローチでは解決しません。アドレスに余分なAddressTypeフィールドを追加したくありません。問題は、UserオブジェクトにHomeAddressIdを持たせて使用することです。 –

+0

私は参照してください。それは単にシンプルで簡単なソリューションです。他のakternativesあなたはリレーションを定義するために流暢なAPIを使用する必要があります。私はそれをうまくしようとします。 ;) –

+0

あなたが尋ねるもの。 –