实体框架代码第一个多列外键

Isr*_*Lot 5 c# sql entity-framework ef-code-first

首先使用代码我设计了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;}

 ...
}
Run Code Online (Sandbox Code Playgroud)

所以基本上我有一个用户在几个城市有不同的细节.UserCityDetail的用户ID是PK和FK.我也希望直接参考主要的城市细节,所以我在用户上放置了一个城市ID FK.

如何将用户ID和MainCityID配置为像MainCityDetail的FK一样?

Era*_*nga 8

由于存在之间两个关系UserUserCityDetailEF具有识别哪些导航性能的问题属于哪个关系.使用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);
    }
}
Run Code Online (Sandbox Code Playgroud)

有关流畅映射的更多详细信息,请查看此处.