实体框架导航属性生成规则

时间:2012-06-18 09:14:01

标签: c# 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

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

2 个答案:

答案 0 :(得分:12)

这是预期的行为,它基于EF

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

答案 1 :(得分:2)

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