实体框架核心外键默认约定

时间:2020-04-02 02:05:47

标签: c# entity-framework entity-framework-core

我正在寻找[ForeignKey]约定的文档。我在MSDN上找到了一个命名约定列表。

我不确定哪个约定对应以下操作。

class Student
{
    public int id{ set; get;}

    public int myclassroomid{ set; get;}

    public Classroom myclassroom{ set; get;}
}

class Classroom
{
    [Key]
    public int cid{ set; get;}
}

我不了解默认约定的工作原理。

我找到了NavigationPropertyNameForeignKeyDiscoveryConvention,这似乎不适用于这种情况。

在哪里可以找到正式文件?解释一些要点,最好有一个代码示例。

2 个答案:

答案 0 :(得分:1)

NavigationPropertyNameForeignKeyDiscoveryConvention涵盖了Student中的导航属性如何找到Student中声明的FK。 AFAIK不会考虑在Classroom实体中设置任何内容。

它将使用类型和引用名称,因此它将查找ClassroomId或MyClassroomId。这经常使想要使用对同一实体的多个引用且其导航属性与类型名称匹配的人们绊倒。即CustomerId /客户客户和CreatedById /客户CreatedBy。 EF可能会尝试根据类型将CreatedBy解析为CustomerId。

导航属性本身会将对您在“课堂”类型中声明为PK的任何字段的引用结合起来。在Classroom中删除cId的[Key]属性将不起作用,因为这与PK约定规则不匹配。 (Id或ClassroomId),它也不会将FK纳入考虑范围,即在学生中放置cId列很可能不会映射到MyClassroom参考。

我个人总是对关系使用显式映射,并且避免声明FK属性,而推荐使用阴影属性/ Map()。如果要使用约定,则应将您的架构设置为符合约定,且无特殊情况。最简单易读的是对PK和FK引用都使用{TableName} + Id。例外是对同一表/实体的多重引用,然后对引用及其关联的FK使用描述性名称。即如果两个导​​航属性都指向一个Customer实体,则用CreatedBy + CreatedById和OrderingCustomer + OrderingCustomerId代替Customer + CustomerId。

答案 1 :(得分:1)

您所看错的地方-所有这些都是针对EF6的,而EF Core是完全不同的系统,因此起点应该是Entity Framework Core处的正式文档。

Foregn键约定在Relationships - Conventions中进行了详细说明:

如果从属实体包含名称与这些模式之一匹配的属性,则它将被配置为外键:

  • <navigation property name><principal key property name>
  • <navigation property name>Id
  • <principal entity name><principal key property name>
  • <principal entity name>Id

在您的示例中,myclassroomid与规则2相匹配-导航属性名称“ myclassroom” +“ Id”。没有明确提及,但是匹配不区分大小写,因此“ Id”也匹配“ ID”,“ id”等。