2012-05-01 43 views
3

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

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

回答

6

由于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

+0

我想它不会这么简单,因为MainCityDetail的PK由2列组成,所以FK也需要2列组成。 –

+0

@IsraelLot查看我的编辑答案。 – Eranga

+0

有没有办法避免用户实体上的重复ID? –

相关问题