我的数据库模型实体框架存在问题。
我的问题在于我的一个模型对一个表有多个引用。
public partial class Customer
{
public int Id { get; set; }
public Nullable<int> PrimaryEngId { get; set; }
public Nullable<int> AssignedDevloperId { get; set; }
public virtual Engineer Engineer { get; set; }
public virtual Engineer Engineer1 { get; set; }
}
在我的模型中,列分别被映射,但是当一个同事从同一个数据库构建模型时,这两个是相反的。
我认为问题是第一次映射到primaryEngId
并且Db约束称为FK_Customer_Engineer
。
随后添加了分配的开发人员ID,并将数据库约束称为FK_Customer_Devloper
按字母顺序Developer
出现在Engineer
之前,实体框架现在以相反的方式映射它们。
我的代码在很多地方引用Engineer
现在已经无法工作
有什么方法可以解决这个问题吗?
非常感谢
伊恩
答案 0 :(得分:2)
您必须在这两个导航属性的外键上添加缺少的ForeignKey属性:
lineData.items
注意:也不要将通用名称用于EF的导航属性。简而言之,EF给你的最好的事情之一就是你可以说:
[ForeignKey("Primary")]
public int? PrimaryEngId { get; set; }
[ForeignKey("Assigned")]
public int? AssignedDevloperId { get; set; }
public virtual Engineer Primary { get; set; }
public virtual Engineer Assigned { get; set; }
视图中的等等,你完全搞砸了像Engineer和Engineer1这样的名字。
NOTE2 :保持@myCustomer.Assigned.Name
代码生成。 Nullable<int>
更具可读性。
NOTE3 :使用VS重构将属性int?
和Engineer
重命名为它们应该是什么(Engineer1
和PrimaryEngineer
等)。之后,将AssignedEningeer
属性添加到模型中。那应该够了。但是,您正在进行的任何未来更改都必须在代码中完成,而不是在db。
IF 另一方面,您不断从数据库中重新生成实体和上下文代码,确保所有外键都具有有意义的名称,因为EF将使用它们来生成名称。(即它未命名为ForeignKey
的蓝色)重命名这些外键以反映逻辑关系。也就是说,你很可能在db中有以下外键:
Engineer1
您需要将它们重命名为
FK_Customer_Engineer
FK_Customer_Engineer1
更新:您可以使用不同的列名称和属性名称:
FK_Customer_PrimaryEngineer
FK_Customer_AssignedEngineer