实体框架(Database-First)与同一个表命名约定控件的多个关系

时间:2014-11-05 13:00:12

标签: c# entity-framework naming-conventions foreign-key-relationship navigation-properties

我们假设我们遇到这种情况:

数据库中的表:

Country (id, country_name), Person (id, login), CountryManager (id_country, id_person), CountryStakeholder (id_country, id_person)

如果我们必须使用Entity Framework Database-First从数据库创建模型,在VS中我们有一个这个类:

class Country {

int id;
string country_name;

virtual ICollection<Person> Person1; // Navigation Properties
virtual ICollection<Person> Person2; // ---------||----------

}

我已经简化了很多代码,但希望你明白这一点。

似乎当Entity Framework处理外键时,它会创建通用导航属性。是否有可能控制按名称创建导航属性的方式?不幸的是,Person1,Person2不是很解释。

3 个答案:

答案 0 :(得分:2)

在VS中,您可以使用GUI执行此操作。

如果您显示模型浏览器,则向下导航树到:

YourEntityModel&gt;实体类型&gt;国家

然后右键单击&#34; Person1&#34;导航属性并选择&#34;属性&#34;然后,您可以将导航属性名称的名称更改为您喜欢的名称:

enter image description here

只需更改名称,保存更改即可...

(实际上有很多方法可以进入导航属性属性窗口 - 你也可以在模型图中右键单击它)

答案 1 :(得分:0)

从条目&#34; Working with Inverse Navigation Properties&#34;来自书&#34; Programming Entity Framework: Code First&#34;:

  

您可以添加配置(使用数据注释或Fluent API)   将此信息提供给模型构建器。有了数据   注释,您将使用名为 InverseProperty 的注释。随着   Fluent API,您将使用Has / With方法的组合   指定这些关系的正确结束。

     

您可以将注释放在关系的任何一端(或   两端如果你想)。我们将它们放在导航属性上   在住宿类(例4-10)。 InverseProperty数据   注释需要相应导航属性的名称   相关的类作为参数。

示例:

[InverseProperty("PrimaryContactFor")]
public Person PrimaryContact { get; set; }

[InverseProperty("SecondaryContactFor")]
public Person SecondaryContact { get; set; }

答案 2 :(得分:0)

我建议使用https://visualstudiogallery.msdn.microsoft.com/ee4fcff9-0c4c-4179-afd9-7a2fb90f5838

它比我见过的任何数据库生成都更灵活。 我仍在努力解决自己的问题,但这看起来很有希望。但是,与EF提供的默认代码生成不同,您可以自定义映射。

就像我在重命名导航属性时看到的所有示例一样 - 仅此一项是不够的,因为EF仍然需要映射才能使用这些导航属性(你可以破解它,并拥有你的User2指向ModifiedByUser,例如)。