如何解决EF Core 5 - DB First - 导航属性命名InverseProperty
我们使用 EF Core 5.0.4 和 DB First 方法。在当前项目中,我们遇到了生成的导航属性名称不理想的情况。 如果我们用主键/外键链接表,命名就可以正常工作。在我们的例子中,我们将多个表(带有要翻译的数据)链接到一个带有唯一索引(翻译键)的翻译表。因此,每个包含要翻译的数据的表都有一个唯一索引,并且翻译表在翻译键和语言代码上有一个主键。
[ForeignKey(nameof(LanguageCode))]
[InverseProperty(nameof(Language.TranslationLanguageCodeNavigations))]
public virtual Language LanguageCodeNavigation { get; set; }
public virtual DeviceType TranslationKey1 { get; set; }
public virtual TransportUnit TranslationKey2 { get; set; }
public virtual News TranslationKey3 { get; set; }
public virtual News TranslationKey4 { get; set; }
public virtual Consumable TranslationKeyNavigation { get; set; }
因此在示例“新闻”中无法看到哪个 TranslationKey 属于哪个字段。该表有两个需要翻译的字段。找出答案的唯一方法是查看生成的上下文。但是不能保证下一次生成上下文时键的编号是相同的。
是否可以以某种方式控制生成的名称?生成上下文然后使用 CodeFirst 方法不是一种选择。
解决方法
您可以使用把手模板:
https://github.com/TrackableEntities/EntityFrameworkCore.Scaffolding.Handlebars
使用 Handlebars 模板搭建 EF Core 模型。
生成时使用 Handlebars.NET 编译 Handlebars 模板 使用 Entity Framework Core 脚手架工具构建模型。
您将拥有一个 ScaffoldingDesignTimeServices 类,用于在生成 dbcontext 时定义很多内容,以及您可以自定义的把手模板,这些模板将在通过脚手架创建实体时使用
// Add Handlebars transformer for Country property
services.AddHandlebarsTransformers(
propertyTransformer: e =>
e.PropertyName == "Country"
? new EntityPropertyInfo("Country",e.PropertyName,false)
: new EntityPropertyInfo(e.PropertyType,e.PropertyIsNullable));
// Add optional Handlebars transformers
//services.AddHandlebarsTransformers(
// entityNameTransformer: n => n + "Foo",// entityFileNameTransformer: n => n + "Foo",// constructorTransformer: e => new EntityPropertyInfo(e.PropertyType + "Foo",e.PropertyName + "Foo"),// propertyTransformer: e => new EntityPropertyInfo(e.PropertyType,// navPropertyTransformer: e => new EntityPropertyInfo(e.PropertyType + "Foo",e.PropertyName + "Foo"));
这可以随着您的代码库/数据库的发展而发展,将脚手架文件和模板保留在源代码控制中将为您提供一种可靠的方法来随着您的软件/数据库的发展而创建所需的 dbcontext
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。