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;}

 ...
}

所以基本上我有一个用户在几个城市有不同的细节。对于 UserCityDetail,用户 ID 既是 PK 又是 FK。我还想直接参考主要城市的详细信息,所以我在 User 上放了一个城市 ID FK。

如何将用户 ID 和 MainCityID 配置为类似于 MainCityDetail 的 FK?

4

1 回答 1

8

由于 EF 之间存在两个关系,因此存在User识别UserCityDetail哪些导航属性属于哪个关系的问题。使用 fluent API 来映射关系。

如果您使用 SQL Server,则会出现另一个问题,因为两个关系会导致多个级联删除路径。所以你必须建立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 回答