【问题标题】:How to map foreign keys to different Table/Column name in EF CodeFirst?如何在EF Code First中将外键映射到不同的表/列名?
【发布时间】:2012-02-14 03:54:57
【问题描述】:

如何使用 EF Code First 将 User 中的字段映射到 LookUpDetail? (最好使用注解,而不是 FluentAPI)

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 和 COuntry。

我试过了

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

这似乎在数据库中设置了字段,但是 LookUpDetail ProvState 当我尝试提取用户记录时始终为空。

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

我错过了什么?

【问题讨论】:

    标签: .net entity-framework foreign-keys ef-code-first


    【解决方案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; }
    }
    

    【讨论】:

    • 谢谢,虚拟修复它(我是个假人)
    【解决方案2】:

    这似乎有效:

    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();
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多