2012-05-01 41 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? –

相關問題