我想知道 Entity Framework 在导航属性的命名/生成方面遵循哪些规则。我已经观察到几个似乎没有意义的场景,所以我想知道是否有人确切地知道这些是如何工作的。
场景 1:
public class Post
{
public int Id { get; set; }
public User Author { get; set; }
}
生成
即。默认情况下,导航属性生成名为 [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; }
}
生成
如您所见,这不会自动注册为导航属性。
场景 3:
如果它不适用于场景 2,为什么它适用于备用命名约定?
public class Post
{
public int Id { get; set; }
public int? AuthorId { get; set; }
public User Author { get; set; }
}
生成
导航属性检测和生成的规则是什么?
最佳答案
这是预期的行为,它基于 EF 的两个不同约定
- 在第一个示例中,您使用的是独立关联,其中您的实体没有 FK 属性。 EF 将使用简单模式在数据库中创建 FK:
NameOfNavigationProperty_NameOfRelatedPK
此约定遵循传统数据库命名。 - 在第二个示例中,您定义了与 EF 使用的 FK 同名的属性。 EF 检测到这一点并向其生成的 FK 添加 1。您的属性未用作 FK 的原因是搜索 FK 属性的第二个约定。此约定预计 FK 属性将具有此名称(约定遵循传统的 .NET 命名):
NameOfNavigationPropertyNameOfRelatedPK
由NavigationPropertyNameForeignKeyDiscoveryConvention
提供NameOfRelatedTypeNameOfItsPK
由TypeNameForeignKeyDiscoveryConvention
提供NameOfRelatedPK
由PrimaryKeyNameForeignKeyDiscoveryConvention
提供
- 在上一个示例中,您正确定义了 FK 属性并且 EF 检测到它,因此它使用外键关联。
关于c# - Entity Framework 导航属性生成规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11079863/