实体框架多次映射到同一个表DB

时间:2016-03-14 12:28:11

标签: c# entity-framework-6

我的数据库模型实体框架存在问题。

我的问题在于我的一个模型对一个表有多个引用。

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现在已经无法工作

有什么方法可以解决这个问题吗?

非常感谢

伊恩

1 个答案:

答案 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重命名为它们应该是什么(Engineer1PrimaryEngineer等)。之后,将AssignedEningeer属性添加到模型中。那应该够了。但是,您正在进行的任何未来更改都必须在代码中完成,而不是在db。

中完成

IF 另一方面,您不断从数据库中重新生成实体和上下文代码,确保所有外键都具有有意义的名称,因为EF将使用它们来生成名称。(即它未命名为ForeignKey的蓝色)重命名这些外键以反映逻辑关系。也就是说,你很可能在db中有以下外键:

Engineer1

您需要将它们重命名为

 FK_Customer_Engineer

 FK_Customer_Engineer1

更新:您可以使用不同的列名称和属性名称:

 FK_Customer_PrimaryEngineer

 FK_Customer_AssignedEngineer