为什么实体框架试图找到这些不存在的列?

时间:2014-05-30 18:12:56

标签: asp.net-mvc entity-framework

public partial class User {

         public int Id { get; set; }

         public Nullable<int> InvoiceAddress_Id { get; set; }

         public Nullable<int> MailAddress_Id { get; set; }


         public virtual Address Address { get; set; }

         public virtual Address Address1 { get; set; }
}

当我尝试使用Linq和Entity框架检索用户时,我得到了;

Invalid column name 'Address_Id1'.
Invalid column name 'Address1_Id1'.
Invalid column name 'Address_Id'.
Invalid column name 'Address_Id1'.

我不知道它为什么会这样出现并且在解决方案中搜索任何这些列都没有给出任何结果!我觉得它与外键有关。

 public partial class Address
{
    public Address()
    {
        this.User = new HashSet<User>();
        this.User1 = new HashSet<User>();
    }
    [Key]
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public string City { get; set; }

    public virtual ICollection<Customer> User { get; set; }
    public virtual ICollection<Customer> User1 { get; set; }

}

以下是我使用实体框架的方式:

CustomDbContext db = new CustomDbContext ();
var user =  db.User.First(a => a.Id != 0);

这是更新后的代码:

public partial class User
{

    public int Id { get; set; }

    public Nullable<int> InvoiceAddress_Id { get; set; }
    public Nullable<int> MailAddress_Id { get; set; }

    public virtual Address InvoiceAddress_ { get; set; }
    public virtual Address MailAddress_ { get; set; }
}

这是错误:

Invalid column name 'Address_Id'.
Invalid column name 'Address_Id1'.

1 个答案:

答案 0 :(得分:1)

问题非常明确:您的代码(属性,流畅的API),EF约定都没有配置FK。

如果要使用约定,则必须调整属性和外键的名称,以便可以配置它们。你在哪里:

public Nullable<int> InvoiceAddress_Id { get; set; }
public virtual Address Address { get; set; }

你应该:

public Nullable<int> InvoiceAddressId { get; set; }
public virtual Address InvoiceAddress { get; set; }

请注意,FK名称是导航属性名称+ "Id"

其他选项是实现DbContext的OnModelCreating并使用流畅的API配置FK:

  protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        modelBuilder.Entity<User>()
            .HasOptional(u => u.Address)
            .WithMany();
            .HasForeingKey(a => a.InvoiceAddres_Id);
    }

或使用[ForeignKey("")]属性:

  

注释可以放在外键属性上并指定关联的导航属性名称,或者放在导航属性上并指定关联的外键名称

[ForeignKey("Address")]
public Nullable<int> InvoiceAddress_Id { get; set; }

[ForeignKey("InvoiceAddress_Id")]
public virtual Address Address { get; set; }