实体框架首先映射到同一个表数据库

Ian*_*Ian 6 c# entity-framework-6

我有一个来自 DB 模型的实体框架问题。

我的问题归结为我的一个模型对一个表有多个引用。

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; }
}
Run Code Online (Sandbox Code Playgroud)

在我的模型中,列分别映射,但是当同事从同一数据库构建模型时,这两个列被颠倒了。

我相信问题是第一个映射到 in 是primaryEngId 并且 Db 约束被称为FK_Customer_Engineer

并且随后添加了分配的开发人员 ID 并调用了 DB 约束 FK_Customer_Devloper

所以按字母顺序Developer排在前面Engineer,实体框架现在以相反的方式映射它们。

我的代码Engineer在很多地方引用了现在不起作用的地方

有没有办法解决这个问题?

非常感谢

伊恩

vit*_*ore 2

您必须在这两个导航属性的外键上添加缺少的foreignkey属性:

[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; }
Run Code Online (Sandbox Code Playgroud)

注意:也不要使用 EF 的导航属性的通用名称。简而言之,EF 为您提供的最好的东西之一就是您可以说:

@myCustomer.Assigned.Name
Run Code Online (Sandbox Code Playgroud)

视图中的等等,而您用诸如 Engineer 和 Engineer1 这样的名称完全搞砸了。

注意2:继续Nullable<int>代码生成。int?更具可读性。

注意 3:使用 VS 重构来重命名属性Engineer及其Engineer1应有的名称(PrimaryEngineer等等AssignedEningeer)。之后将ForeignKey属性添加到您的模型中。那应该足够了。但是,您将来所做的任何更改都必须在代码中完成,而不是在数据库中完成。

另一方面,如果您不断从数据库重新生成实体和上下文代码,请确保所有外键都有有意义的名称,因为 EF 将使用它们来生成名称。(即,它不是凭空命名的Engineer1)重命名这些外键来体现什么是逻辑关系。即您很可能在数据库中有以下外键:

 FK_Customer_Engineer

 FK_Customer_Engineer1
Run Code Online (Sandbox Code Playgroud)

您需要将它们重命名为

 FK_Customer_PrimaryEngineer

 FK_Customer_AssignedEngineer
Run Code Online (Sandbox Code Playgroud)

更新:您可以有不同的列名称和属性名称,如下所示:

[Column("PrimaryEngId")]
[ForeignKey("Primary")]
public int? PrimaryID { get; set; }
Run Code Online (Sandbox Code Playgroud)