C# EF核心5-DB优先-导航属性命名(反向属性)

C# EF核心5-DB优先-导航属性命名(反向属性),c#,entity-framework-core,.net-5,C#,Entity Framework Core,.net 5,我们使用EF Core 5.0.4和DB优先方法。在当前项目中,导航属性的生成名称并不理想。 如果我们使用主键/外键链接表,那么命名工作正常。在本例中,我们将多个表(包含要翻译的数据)链接到具有唯一索引(翻译键)的翻译表。因此,每个包含要翻译的数据的表都有一个唯一的索引,并且翻译表在翻译键和语言代码上有一个主键 在这种情况下,EF生成如下名称: [ForeignKey(nameof(LanguageCode))] [InverseProperty(nameof(Language.Translat

我们使用EF Core 5.0.4和DB优先方法。在当前项目中,导航属性的生成名称并不理想。 如果我们使用主键/外键链接表,那么命名工作正常。在本例中,我们将多个表(包含要翻译的数据)链接到具有唯一索引(翻译键)的翻译表。因此,每个包含要翻译的数据的表都有一个唯一的索引,并且翻译表在翻译键和语言代码上有一个主键

在这种情况下,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; }
因此,在示例“新闻”中,不可能看到哪个TranslationKey属于哪个字段。此表有两个可转换的字段。找到答案的唯一方法是查看生成的上下文。但不能保证下次生成上下文时,密钥的编号会相同


是否有可能控制生成的名称?生成上下文然后使用CodeFirst方法不是一个选项。

您可以使用把手模板:

脚手架EF核心模型使用把手模板

生成时使用handlebar.NET编译把手模板 具有实体框架核心支架工具的模型

您将拥有一个scaffoldingsigntimeservices类,在该类中可以定义dbcontext生成过程中的许多内容,还可以自定义把手模板,这些模板将在通过scaffolding创建实体时使用

        // 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"));

这可以随着您的代码库/DB的发展而发展,将脚手架文件和模板保留在源代码控制中将为您提供一种可靠的方法,随着软件的发展创建所需的dbcontext/DB

不确定这是否有帮助,但您是否尝试过使用EF model browser更改名称?您使用的数据库提供程序是什么?我使用的是SQL server提供程序谢谢您的回答。听起来很有希望。我明天会试试的。Wit还没起作用,我还在弄清楚整个带扶手的脚手架是怎么工作的。但我已经可以用这些把手解决另一个问题了。