实体框架导航属性命名约定

时间:2014-05-20 09:42:38

标签: c# sql-server entity-framework

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

个人资料表格结构

Id int主键 .... ....

ProfileHistory表结构

Id int主键

ProfileId int Profile表的外键

ManagerId是Profile表的外键

...

我的问题是: 由于目前我只知道这一点,我正在从数据库创建我的实体模型。 使用导航属性创建模型和实体类 ProfileHistory实体如下:

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

令人困惑。因为不清楚哪个关系的导航属性。 如果我在两个表之间有更多关系,那就更糟了。导航属性名称正在变为Profile,Profile1,Profile2等。 我希望有与其外键关系相关的导航属性的名称。

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

提前感谢您的帮助。

Muharrem

4 个答案:

答案 0 :(得分:1)

我还没有对其进行测试,但您可以使用属性将属性映射到列:

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

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

更改列中的类型和名称。

答案 1 :(得分:1)

您始终可以在模型图中重命名属性。单击导航属性时,可以在“属性”窗口中找到该名称。

答案 2 :(得分: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;
        }
    }
}

答案 3 :(得分:-1)

我前段时间遇到过同样的问题。嗯,它甚至比名字混乱还要大。如果您有另一个表格的导航属性,例如ProfileProfile1Profile2,则您删除/编辑相应的外键后,您可能最终会将这些属性混合在一起。如果您使用EntitySQL查询数据,由于检索到错误的数据/错误的表连接条件,您最终会遇到错误...

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

FK_[Table]_[Meaning]
...
FK_ProfileHistory_InitialProfile
FK_ProfileHistory_UpdatedProfile

接下来,有了这些信息,我使用外键名称的[Meaning]部分命名了属性。