对于主外键约定的理解,其实是学习实体间一对一和一对多关系的基础。
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; }
}