首先使用代码我设计了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。我也希望直接参考主要的城市细节,所以我在用户上放置了一个城市ID FK。
如何将用户ID和MainCityID配置为像MainCityDetail的FK一样?
答案 0 :(得分:7)
由于User
和UserCityDetail
之间存在两种关系,因此EF存在识别哪种导航属性属于哪种关系的问题。使用流畅的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);
}
}
有关流畅映射的更多详细信息,请查看here。