EF Core 5 - DB First - 导航属性的命名 (InverseProperty)
EF Core 5 - DB First - Naming of navigation properties (InverseProperty)
我们使用 EF Core 5.0.4 和数据库优先方法。在当前项目中,我们遇到的情况是生成的导航属性名称并不理想。
如果我们使用 link table 和 primary/foreign 键,命名工作正常。在我们的例子中,我们 link 多个 table s(带有要翻译的数据)到具有唯一索引(翻译键)的翻译 table 。因此每个 table 包含要翻译的数据都有一个唯一索引,翻译 table 在翻译键和语言代码上有一个主键。
在这种情况下,EF 生成如下名称:
[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; }
因此无法看到示例“News”中哪个 TranslationKey 属于哪个字段。 table 有两个字段需要翻译。找出答案的唯一方法是查看生成的上下文。但是不能保证我们下次生成上下文的时候key的个数是一样的。
是否可以通过某种方式控制生成的名称?生成上下文然后使用 CodeFirst 方法不是一种选择。
您可以使用把手模板:
https://github.com/TrackableEntities/EntityFrameworkCore.Scaffolding.Handlebars
Scaffold EF Core models using Handlebars templates.
Uses Handlebars.NET to compile Handlebars templates when generating
models with the Entity Framework Core scaffolding tools.
您将有一个 ScaffoldingDesignTimeServices class 可以在其中定义有关生成 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.PropertyName, 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, e.PropertyName + "Foo"),
// navPropertyTransformer: e => new EntityPropertyInfo(e.PropertyType + "Foo", e.PropertyName + "Foo"));
这可以随着您的 codebase/DB 的发展而发展,将脚手架文件和模板保留在源代码管理中将为您提供一种可靠的方式来随着您的 software/db[=14= 的发展创建所需的 dbcontext ]
我们使用 EF Core 5.0.4 和数据库优先方法。在当前项目中,我们遇到的情况是生成的导航属性名称并不理想。 如果我们使用 link table 和 primary/foreign 键,命名工作正常。在我们的例子中,我们 link 多个 table s(带有要翻译的数据)到具有唯一索引(翻译键)的翻译 table 。因此每个 table 包含要翻译的数据都有一个唯一索引,翻译 table 在翻译键和语言代码上有一个主键。
在这种情况下,EF 生成如下名称:
[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; }
因此无法看到示例“News”中哪个 TranslationKey 属于哪个字段。 table 有两个字段需要翻译。找出答案的唯一方法是查看生成的上下文。但是不能保证我们下次生成上下文的时候key的个数是一样的。
是否可以通过某种方式控制生成的名称?生成上下文然后使用 CodeFirst 方法不是一种选择。
您可以使用把手模板:
https://github.com/TrackableEntities/EntityFrameworkCore.Scaffolding.Handlebars
Scaffold EF Core models using Handlebars templates.
Uses Handlebars.NET to compile Handlebars templates when generating models with the Entity Framework Core scaffolding tools.
您将有一个 ScaffoldingDesignTimeServices class 可以在其中定义有关生成 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.PropertyName, 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, e.PropertyName + "Foo"),
// navPropertyTransformer: e => new EntityPropertyInfo(e.PropertyType + "Foo", e.PropertyName + "Foo"));
这可以随着您的 codebase/DB 的发展而发展,将脚手架文件和模板保留在源代码管理中将为您提供一种可靠的方式来随着您的 software/db[=14= 的发展创建所需的 dbcontext ]