2016-03-14 155 views
3

我有一个数据库模型的实体框架问题。实体框架先映射到同一个表格数据库

我的问题是,我的一个模型有一个表的多个引用。

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,随后加入和DB约束被称为FK_Customer_Devloper

所以按字母顺序DeveloperEngineer之前和Entity Framework现在它们映射其他方式轮。

我的代码引用在相当多的地方,其中Engineer现在行不通

有什么出路呢?

非常感谢

伊恩

回答

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

:也不要使用通用名称与EF导航属性。在最好的东西简单地说一个EF给你的是,你可以说:

@myCustomer.Assigned.Name 

等在视图中,你是完全与像工程师,工程师1名拧起来。

NOTE2:保留Nullable<int>代码生成。 int?更具可读性。

注3:使用VS重构重命名性能EngineerEngineer1他们应该是什么(PrimaryEngineerAssignedEningeer等)。之后,将ForeignKey属性添加到您的模型中。这应该够了。但是,您所做的任何未来更改都必须在代码中完成,而不是在db中完成。

IF您正在不断地从数据库中再生实体和上下文代码另一方面,请确保您的所有外键具有有意义的名称,如EF将使用它们生成的名字。(即不命名Engineer1出蓝色)重命名这些外键以反映逻辑关系。例如,你很可能有以下外键在DB:

FK_Customer_Engineer 

FK_Customer_Engineer1 

你需要将它们重新命名为

FK_Customer_PrimaryEngineer 

FK_Customer_AssignedEngineer 

更新:你可以有不同的列名和属性名像这样:

[Column("PrimaryEngId")] 
[ForeignKey("Primary")] 
public int? PrimaryID { get; set; } 
+0

很遗憾,当我接管项目主管时,模型正在使用DB第一个系统进行开发。所以所有这些数据库代码都是由实体框架生成的,在更改数据库第一个系统中的代码时是否存在问题? – Ian

+0

取决于计划对模式进行更改的位置 - 代码或模式中。如果每次都需要从db中重新生成classess,那么修改它就没什么意义了,因为每次你最终都会这样做。如果您在代码中进行了任何未来更改并在db上运行ef-migration,则可以更新这些内容,因为就EF而言,只涉及外键名称,默认情况下它等于属性名称,但可以被重写有属性,如果你想要你的代码遵循你的代码约定/风格指南等。 – vittore

+0

在我们的例子中,所有的改变都在模式中完成 – Ian

相关问题