实体框架Code First多列外键

5

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

 ...
}

基本上我有一个用户在多个城市有不同的详细信息。 用户ID既是UserCityDetail的PK,也是FK。我还想直接引用主要城市的详细信息,因此在用户上放了一个城市ID FK。

如何配置用户ID和MainCityID以像FK一样对待MainCityDetail?

1个回答

8

由于 UserUserCityDetail 之间存在两种关系,EF 无法确定哪些导航属性属于哪种关系。使用 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);
    }
}

如果您想了解流畅映射的更多细节,请查看这里


我猜这样简单地做不行,因为MainCityDetail的PK由2列组成,所以FK也需要由2列组成。 - Israel Lot
用户实体上无法避免重复的ID吗? - Israel Lot
@IsraelLot 是的。你可以将这些FK列映射为属性,也可以省略它们作为属性的映射。 - Eranga

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接