entity framework(Database-First)与同一个表命名约定控件的多个关系

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

数据库中的表:

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 Person1; // Navigation Properties virtual ICollection Person2; // ---------||---------- } 

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

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

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

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

YourEntityModel>实体类型>国家/地区

然后右键单击“Person1”导航属性并选择“属性”,然后可以将导航属性名称的名称更改为您喜欢的任何名称:

在此处输入图像描述

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

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

来自“ 编程entity framework:代码优先 ”一书中的“ 使用反向导航属性 ”条目:

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

您可以将注释放在关系的任一端(如果需要,可以放在两端)。 我们将它们放在Lodging类的导航属性中(例4-10)。 InverseProperty Data Annotation需要相关类中相应导航属性的名称作为其参数。

例:

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

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

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

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