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


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

    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; }
    }
    
  • 相关阅读:
    samba安装和配置
    linux下打包命令的使用
    Linux目录结构简析
    Linux服务器的安装
    linux下定时任务设置
    创建表空间并授权
    selenium2.0(WebDriver) API
    selenium + python之元素定位
    Linux实战教学笔记13:定时任务补充
    Linux实战教学笔记11:linux定时任务
  • 原文地址:https://www.cnblogs.com/codersun/p/8624947.html
Copyright © 2020-2023  润新知