欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

EF Code First中的主外键约定和一对一、一对多关系的实现

程序员文章站 2022-04-08 15:39:38
对于主外键约定的理解,其实是学习实体间一对一和一对多关系的基础。 1.1 主键(Key)约定 主键的默认约定是: 只要字段名为 实体名(类名)+"id"(不区分大小写) ,这就算是默认的主键约定。 如果要显示标识的话,就使用特性标签进行标识: 这样标识的主键,在数据库的名称就是 StudentKey ......

对于主外键约定的理解,其实是学习实体间一对一和一对多关系的基础。

1.1 主键(Key)约定

主键的默认约定是:只要字段名为--实体名(类名)+"id"(不区分大小写),这就算是默认的主键约定。

如果要显示标识的话,就使用特性标签进行标识:

public class Student
{
    [Key]
    public int StudentKey { get; set; }
    public string StudentName { get; set; }
}

这样标识的主键,在数据库的名称就是StudentKey

2.1 外键(ForeignKey)约定

外键约定稍微复杂一些,主要分为三种形式的显示指定外键和默认的外键约定。在一对一关系中比较简单,在一对多关系中约定规则多一些。

2.1.1 一对一关系中的外键约定

在文档中,这种叫做One-to-Zero-or-One Relationship,这种关系必须手动指定主从表,因为在一个一对一关系中,系统是没法推测出来谁是主表谁是从表的,而且因为从表的主键也是主表的主键,也是从表的外键,所以没有必要和多对多关系那样,指定一个字段作为外键,或者为外键设置一个友好字段名,这些都是不需要的。

EF中的一对一关系实现如下:

 public class Student
{
    public int StudentId { get; set; }
    public string StudentName { get; set; }

    public virtual StudentAddress Address { get; set; }
}
     
public class StudentAddress 
{
    [ForeignKey("Student")]
    public int StudentAddressId { get; set; }
        
    public string Address1 { get; set; }
    public string Address2 { get; set; }
    public string City { get; set; }

    public virtual Student Student { get; set; }
}

2.1.2 一对一关系的Fluent API实现

欠着

2.2.1 一对多关系中的外键约定

默认约定:

默认约定,只需要两个导航属性就能实现,student中会根据两个表名,把standard表的主键作为student的外键生成一个长名。

 public class Student
{
    public int StudentID { get; set; }
    public string StudentName { get; set; }
    //public int StandardId { get; set }
    public Standard Standard { get; set; }
}

public class Standard
{
    public int StandardId { get; set; }
    public string StandardName { get; set; }
    
    public ICollection<Student> Students { get; set; }
}

当然如果觉得系统生成的名称不友好,我们可以自己设置外键的名字,其中默认的配置规则是entity中如果有字段是导航属性的名称+id(不区分大小写),即把这个字段设置成外键。

显示指定

当然我们可以使用特性标签[ForeignKey]来指定某个字段作为外键:

    [ForeignKey("Standard")]
    public int StandardRefId { get; set; }

这样的话,外键名称就叫StandardRefId。

我们也可以把标签属性放在导航属性,指定某个字段作为被特性标签修饰的导航属性在当前实体的外键。

    [ForeignKey("StandardRefId")]
    public Standard Standard { get; set; }

最后一种,我们可以在主表的导航属性上,也就是字表的ICollection集合上,用特性标签指定外键:

public class Standard
{
    public int StandardId { get; set; }
    public string StandardName { get; set; }
    
    [ForeignKey("StandardRefId")]
    public ICollection<Student> Students { get; set; }
}