12

我想知道实体框架在导航属性的命名/生成方面遵循什么规则。我观察到了几种似乎没有意义的场景,所以我想知道是否有人确切地知道这些是如何工作的。

场景一:

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

   生成

方案 1

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

场景二:

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

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

   生成

方案 2

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

场景 3:

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

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

   生成

方案 3

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

4

2 回答 2

12

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

  • 在第一个示例中,您使用的是独立关联,您的实体没有 FK 属性。EF 将使用简单模式在数据库中创建 FK:NameOfNavigationProperty_NameOfRelatedPK此约定遵循传统的数据库命名。
  • 在第二个示例中,您定义了与 EF 使用的 FK 同名的属性。EF 检测到这一点并将 1 添加到其生成的 FK。您的属性不用作 FK 的原因是搜索 FK 属性的第二个约定。此约定要求 FK 属性具有此名称(约定遵循传统的 .NET 命名):
    • NameOfNavigationPropertyNameOfRelatedPK由...提供NavigationPropertyNameForeignKeyDiscoveryConvention
    • NameOfRelatedTypeNameOfItsPK由...提供TypeNameForeignKeyDiscoveryConvention
    • NameOfRelatedPK由...提供PrimaryKeyNameForeignKeyDiscoveryConvention
  • 在上一个示例中,您正确定义了 FK 属性并且 EF 检测到它,因此它使用外键关联。
于 2012-06-18T11:09:15.317 回答
2

除了上面@Ladislav Mrnka 的回答,您还可以在此处找到实体框架默认约定的详细参考:http: //msdn.microsoft.com/en-us/library/system.data.entity.modelconfiguration.conventions (v =vs.103).aspx

于 2014-02-17T21:11:40.643 回答