Entity Framework多个映射到相同表 DB first

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

在我的模型中,列分别被映射,但是当同事从相同的数据库构建模型时,两者被颠倒了。
我认为问题在于第一个映射到in的是primaryEngId,而数据库约束称为FK_Customer_Engineer
然后添加了分配的开发人员id,数据库约束称为FK_Customer_Devloper 所以按字母顺序,DeveloperEngineer之前,Entity Framework现在将它们反过来映射。
我的代码在很多地方引用了Engineer,现在无法使用了
有没有办法解决这个问题?
非常感谢
Ian
1个回答

2

您需要在这两个导航属性上添加缺失的外键属性:

[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; }
< p > < em >注意:在使用EF时,也不要为导航属性使用通用名称。 简而言之,EF最好的一点是你可以说:
@myCustomer.Assigned.Name

在视图中等等,但是您使用“工程师”和“Engineer1”这样的名称完全搞砸了。

注意2:保留Nullable<int>进行代码生成。 int?更易读。

注意3:使用VS重构将属性EngineerEngineer1重命名为它们应该是什么(例如PrimaryEngineerAssignedEningeer)。之后,在模型中添加ForeignKey属性。那应该就足够了。然而,任何您未来所做的更改都必须在代码中完成,而不是在数据库中完成。

如果另一方面,您不断地从数据库重新生成实体和上下文代码,请确保所有外键都具有有意义的名称,因为EF将使用它们生成名称。(即它不是突然被命名为Engineer1)将这些外键重命名以反映逻辑关系是最好的选择。例如,您可能在数据库中有以下外键:

 FK_Customer_Engineer

 FK_Customer_Engineer1

你需要将它们重命名为:
 FK_Customer_PrimaryEngineer

 FK_Customer_AssignedEngineer
< p >< em >更新:您可以像这样拥有不同的列名和属性名:
[Column("PrimaryEngId")]
[ForeignKey("Primary")]
public int? PrimaryID { get; set; }

1
很遗憾的是,当我接任项目主管时,模型正在使用“数据库优先”系统进行开发。因此,所有这些的DB代码都是由实体框架生成的。在“数据库优先”系统中改变代码是否会出现问题? - Ian
取决于您计划在架构中进行更改的位置 - 在代码中还是在架构中。如果您需要每次从数据库重新生成类,那么更改它就没有太多意义,因为您最终将不得不每次都这样做。如果您将来要对代码进行任何更改并在数据库上运行ef-migration,则可以更新这些更改,因为就EF而言,只有外键名称,其默认情况下等于属性名称,但可以使用属性覆盖,如果您希望您的代码遵循您的代码约定/样式指南等。 - vittore

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接