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

时间:2012-05-01 10:36:30

标签: 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;}

 ...
}

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

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

1 个答案:

答案 0 :(得分:7)

由于UserUserCityDetail之间存在两种关系,因此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