c# - Entity Framework 导航属性生成规则

标签 c# entity-framework

我想知道 Entity Framework 在导航属性的命名/生成方面遵循哪些规则。我已经观察到几个似乎没有意义的场景,所以我想知道是否有人确切地知道这些是如何工作的。

场景 1:

public class Post
{
    public int Id { get; set; }
    public User Author { get; set; }
} 

生成

Scenario 1

即。默认情况下,导航属性生成名为 [PropertyName]_Id 的 FK

场景 2:

有意义的是,如果 EF 在您手动指定 FK Id 时生成格式为 [PropertyName]_Id 的属性,但是它将遵循相同的规则:

public class Post
{
    public int Id { get; set; }
    public int? Author_Id { get; set; }
    public User Author { get; set; }
}

生成

Scenario 2

如您所见,这不会自动注册为导航属性。

场景 3:

如果它不适用于场景 2,为什么它适用于备用命名约定?

public class Post
{
    public int Id { get; set; }
    public int? AuthorId { get; set; }
    public User Author { get; set; }
}

生成

Scenario 3

导航属性检测和生成的规则是什么?

最佳答案

这是预期的行为,它基于 EF 的两个不同约定

  • 在第一个示例中,您使用的是独立关联,其中您的实体没有 FK 属性。 EF 将使用简单模式在数据库中创建 FK:NameOfNavigationProperty_NameOfRelatedPK 此约定遵循传统数据库命名。
  • 在第二个示例中,您定义了与 EF 使用的 FK 同名的属性。 EF 检测到这一点并向其生成的 FK 添加 1。您的属性未用作 FK 的原因是搜索 FK 属性的第二个约定。此约定预计 FK 属性将具有此名称(约定遵循传统的 .NET 命名):
    • NameOfNavigationPropertyNameOfRelatedPKNavigationPropertyNameForeignKeyDiscoveryConvention 提供
    • NameOfRelatedTypeNameOfItsPKTypeNameForeignKeyDiscoveryConvention 提供
    • NameOfRelatedPKPrimaryKeyNameForeignKeyDiscoveryConvention 提供
  • 在上一个示例中,您正确定义了 FK 属性并且 EF 检测到它,因此它使用外键关联。

关于c# - Entity Framework 导航属性生成规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11079863/

相关文章:

entity-framework - EF Core 中使用注入(inject) DbContext 的并行异步调用的最佳实践是什么?

.net - Entity Framework 4.3 与 5.0 更新差异

asp.net-mvc - 将 Entity Framework 与温莎城堡一起使用

c# - ASP.NET 添加迁移 'composite primary key error' 如何使用 Fluent API

c# - 2 列范围之间的 Linq 值

c# - 流不写入文件

c# - 发布一个集合和 ModelState

c# - "preferring composition over inheritance"时生成透传码

c# - 基于 mailgun api 读取 json 响应的电子邮件验证

c# - 使用 SoundPlayer 播放声音