2012-02-14 26 views
1

如何使用EF Code First將用戶映射到LookUpDetail的字段? (優選使用註釋,未FluentAPI)如何將外鍵映射到EF CodeFirst中的不同表/列名?

public class User 
{ 
    public int? ProvStateId { get; set; } 
    public LookUpDetail ProvState { get; set; } 
    public int? CountryId { get; set; } 
    public LookUpDetail Country { get; set; } 
} 
public class LookUpDetail 
{ 
    public int LookUpDetailId { get; set; } 
    public string Value { get; set; } 
} 

欲ProvStateId和CountryId都映射到LookUpDetailId,並能夠拉動用戶記錄時填充ProvState和國家。

我已經試過

[ForeignKey("ProvStateId")] 
public LookUpDetail ProvState { get; set; } 

這似乎在DB中設置的領域,但 LookUpDetail ProvState 總是空當我試圖去拉一個用戶記錄。

LookUpDetail表已填充,我可以很好地顯示它的內容。

我錯過了什麼?

回答

1

您需要將Model類屬性設置爲虛擬屬性,該屬性將允許EF框架創建代理並在您執行延遲加載時爲您加載相關對象。

(我不知道你做延遲加載與否,如果不是你需要做明確的負載相關對象) 試試這個....

public class User 
{ 
    public virtual int? ProvStateId { get; set; } 
    public virtual LookUpDetail ProvState { get; set; } 
    public virtual int? CountryId { get; set; } 
    public virtual LookUpDetail Country { get; set; } 
} 

public class LookUpDetail 
{ 
    public virtual int LookUpDetailId { get; set; } 
    public virtual string Value { get; set; } 
} 
+0

謝謝,虛擬固定我t(我是個假人) – TheFabledOne 2012-02-24 04:53:10

0

這似乎工作:

public class User 
{ 
    [Key] 
    public string UserName { get; set; } 
    public int? ProvStateId { get; set; } 
    [ForeignKey("ProvStateId")] 
    public LookUpDetail ProvState { get; set; } 
    public int? CountryId { get; set; } 
    [ForeignKey("CountryId")] 
    public LookUpDetail Country { get; set; } 
} 

public class LookUpDetail 
{ 
    [Key] 
    public int LookUpDetailId { get; set; } 
    public string Value { get; set; } 
} 

我與以下測試,它輸出,並構造爲預期的分貝:

static void Main(string[] args) 
    { 
     var db = new TestContext(); 

     db.LookUpDetails.Add(new LookUpDetail {Value = "ProvState1"}); 
     db.LookUpDetails.Add(new LookUpDetail { Value = "ProvState2" }); 
     db.LookUpDetails.Add(new LookUpDetail { Value = "ProvState3" }); 
     db.LookUpDetails.Add(new LookUpDetail { Value = "ProvState4" }); 
     db.LookUpDetails.Add(new LookUpDetail { Value = "ProvState5" }); 
     db.LookUpDetails.Add(new LookUpDetail { Value = "Country1" }); 
     db.LookUpDetails.Add(new LookUpDetail { Value = "Country2" }); 

     db.SaveChanges(); 

     db.Users.Add(new User 
         { 
          UserName = "User1", 
          Country = db.LookUpDetails.Find(6), 
          ProvState = db.LookUpDetails.Find(1) 
         }); 

     db.Users.Add(new User 
         { 
          UserName = "User2", 
          Country = db.LookUpDetails.Find(7), 
          ProvState = db.LookUpDetails.Find(2) 
         }); 

     db.SaveChanges(); 

     foreach (User user in db.Users) 
      Console.WriteLine(string.Format("\n\nUser Name: {0}, Prov State: {1}, Country: {2}", user.UserName, 
              user.ProvState.Value, user.Country.Value)); 
     Console.ReadLine(); 
    } 
相關問題