2014-05-20 48 views
1

我有两个名为Profile和ProfileHistory的表。 ProfileHistory中的每条记录都必须属于配置文件表中的配置文件,因此两个表之间存在外键关系。此外,在ProfileHistory表中,还有一个名为ManagerId的列,它也与具有外键关系的Profile表相关。实体框架导航属性命名约定

档案表结构

ID INT主键 .... ....

ProfileHistory表结构

ID INT主键

简档INT外键简介表

ManagerId配置文件表的外键

....

我的问题是: 由于目前我只知道这一点,我创建数据库,从我的实体模型。 模型,因此实体类与导航属性在 ProfileHistory实体像以下创建:

public virtual Profile Profile { get; set; } 
public virtual Profile Profile1 { get; set; } 

它是如此混乱。因为不清楚哪个导航属性为哪个关系。 即使我在两张桌子之间有更多关系,情况也会更糟糕。导航属性名称正在成为配置文件,Profile1,Profile2等 我期待有与其外键关系相关的导航属性的名称。

如何使我的导航属性名称与其外键关系有关,在我的情况下“从Profile1到ProfileManager”?

在此先感谢您的帮助。

Muharrem

回答

1

您可以随时重命名模型图中的属性。当您点击导航属性时,可以在属性窗口中找到该名称。

+1

我affraid ,当你更新时,你的属性会被重新命名,所以在开发环境中做这件事非常令人沮丧。 – Complexity

+2

不,您所做的手动更改不会被覆盖。我总是使用Model和DB第一种方案来做到这一点。 – SoftwareFactor

+0

好的,我为这个错误道歉:-) – Complexity

1

我没有测试它,但你可以使用属性的属性映射到列:

[Column(“BlogDescription", TypeName="ntext")] 
public virtual Profile Profile { get; set; } 

[Column("Profile1", TypeName="int")] 
public virtual Profile ProfileManager { get; set; } 

更改类型和列的名称,因为它是在数据库。

-1

前段时间我确实面临同样的问题。那么,它更大,然后只是混乱的名字。如果你有另一个表的导航属性,如Profile,Profile1,Profile2,接下来你删除/编辑相应的外键,你最终可能会混在一起。如果使用EntitySQL查询数据,最终会因为检索到的错误数据/错误的表连接条件而出现错误...

我所做的是更改t4模板并修改了生成属性的方式。在编写属性代码文本时,您将获得关于与其相关的关联和外键的信息。外键的名字都在数据库中是唯一和我命名为那些有以下模式

​​

接下来,有这个信息,我命名为外键名称的[Meaning]部分属性。

+0

-1没有迹象表明如何做到这一点 - 如果你没有详细说明要做什么改变,人们应该如何使用这个答案? – Bertie

+0

你想要我在这里粘贴t4代码吗?当您在t4中建立实体中每个单独属性的信息时,您将拥有元数据上下文。只需使用关于协会的信息 – Andrew

+0

嗨安德鲁 - 这将是很好的给一些片段,以指示如何做到这一点。尽管我现在使用了一些其他资源,但我已经设法做了一份体面的工作 - 但它对未来的读者可能会很好。我发现最有用的帖子可以在这里找到:http://stackoverflow.com/a/13064383/978562 – Bertie

0

我通常解决这个问题的方法是通过部分类来添加属性,这些属性可以更好地表示我所追求的内容。这样,如果我需要从图中删除实体并重新添加它,则不会丢失模型中的任何重命名列。

这样做的缺点是您需要记住您不能在查询中使用它们,因为EF不知道如何将它转换为SQL查询。但是如果你已经有了你的Profile对象,访问myProfile.Manager比myProfile.Profile1容易得多。

因此,举例来说,如果EF创造了这个给你:

public partial class ProfileHistory 
{ 
    public virtual Profile Profile { get; set; } 
    public virtual Profile Profile1 { get; set; } 
} 

我最终会创建一个部分类像这样重新映射列:

public partial class ProfileHistory 
{ 
    public Profile Manager 
    { 
     get 
     { 
      return this.Profile1; 
     } 

     set 
     { 
      this.Profile1 = value; 
     } 
    } 
}