5

最初にコードを使用して、3 つのクラスを設計しました。

class User {     

 public Int32 ID {get;set;}  

 public virtual ICollection<UserCityDetail> {get;set;}

 public Int32 MainCityID {get;set;}
 public UserCityDetail MainCityDetail {get;set;}

}

class City{

 public Int32 ID {get;set;}

 ...
}

class UserCityDetail{

 [Key, Column(Order = 0)]
 public Int32 UserID {get;set;}

 [Key, Column(Order = 1)]
 public Int32 CityID{get;set;}

 ...
}

基本的に、いくつかの都市で異なる詳細を持つユーザーがいます。ユーザー ID は、UserCityDetail に対する PK と FK の両方です。また、主要な都市の詳細を直接参照したいので、都市 ID FK を User に置きました。

MainCityDetail の FK のように機能するようにユーザー ID と MainCityID を構成するにはどうすればよいですか?

4

1 に答える 1

8

との間には2つの関係があるためUserUserCityDetailEFには、どのナビゲーションプロパティがどの関係に属するかを識別するという問題があります。流暢なAPIを使用して関係をマッピングします。

SQL Serverを使用している場合は、2つの関係が複数のカスケード削除パスにつながるため、別の問題が発生します。したがってMainCityDetail、オプションの関係を作成する必要があります。

class User {     

 public Int32 ID {get;set;}  

 public virtual ICollection<UserCityDetail> {get;set;}

 public int? MainCityUserID {get;set;}
 public int? MainCityID {get;set;}

 public UserCityDetail MainCityDetail {get;set;}

}


public class MyContext : DbContext
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<User>()
            .HasOptional(u => u.MainCityDetail)
            .WithMany()
            .HasForeignKey(u => new { u.MainCityUserID, u.MainCityID})
            .WillCascadeOnDelete(false);

        modelBuilder.Entity<User>()
            .HasMany(u => u.Cities)
            .WithRequired(d => d.User)
            .HasForeignKey(d => d.UserId);
    }
}

流暢なマッピングの詳細については、こちらを確認してください。

于 2012-05-01T10:49:14.313 に答える