3.2.5 设计模型之间的关联性
在设计数据库结构时,当遇到表格与表格间有关联存在时,一般会通过创建外键(Foreign Key)的方式设计表格之间的关联关系。在Management Studio中使用“数据库关系图”功能设置的表格关联图如下图所示。
在关系数据库中,除了一对多的关联外,另一个常用的就是多对多关联了,在此,我们将介绍这两种关联的开发方法。
1. 设计模型之间的一对多关联
如果想要通过Code First定义这种一对多的关联表格,可以先定义好两个数据模型,然后再到数据上下文类里定义两个数据模型之间的关联。
先来看看这两个数据模型的程序演示代码,跟我们之前写的差不多,只是把Name与Email属性移到另一个名为Member的类别之中,代码如下:
public class Guestbook { public int GuestbookId { get; set; } [Required] public string Message { get; set; } [DatabaseGenerated(DatabaseGeneratedOption.Computed)] public DateTime CreatedOn { get; set; } }
public class Member { public int MemberId { get; set; } [Required] [MaxLength(5)] public string Name { get; set; } [MaxLength(200)] public string Email { get; set; } }
接着,为了让Entity Framework能够管理这两个数据模型在数据库中对应的表格,我们必须修改数据上下文类,把新增的Member类别添加进来,代码如下:
public class MvcGuestbookContext:DbContext { public DbSet<Guestbook> Guestbooks { get; set; } public DbSet<Member> Members { get; set; } } }
如果数据库是通过上述程序代码所创建出来的,将会如下图所示。
为了要设计出Guestbook与Member这两个数据模型的关联,必须在个别的类别加上各自的“导航属性”(Navigation Property)。导航属性是实体类上的可选属性,允许从关联的一端导航到另一端。与其他属性不同,导航属性并不携带数据。
对Member来说,一个Member信息可以包含多条Guestbook数据,因此我们在Member数据模型上,必须新增一个导航属性,并以ICollection<Guestbook>类型做声明;而对Guestbook来说,一条留言信息只会隶属于一个会员,所以必须新增一个导航属性,以Member类型做声明。完成后的程序代码如下:
public class Guestbook { public int GuestbookId { get; set; } [Required] public string Message { get; set; } [DatabaseGenerated(DatabaseGeneratedOption.Computed)] public DateTime CreatedOn { get; set; }
public int MemberId{get;set;} public Member Member { get; set; } }
如果不加上MemberId,则ef会自动生成两张表的连接字段。然而我们为了更方便地读取Member,一般加上此属性。
public class Member { public int Id { get; set; } [Required] [MaxLength(5)] public string Name { get; set; } [MaxLength(200)] public string Email { get; set; } public ICollection<Guestbook> Guestbooks { get; set; } }
当我们把程序运行起来后,会发现数据库中的关联也被完整地创建了,如下图所示。
2. 设计模型之间的多对多关联
在数据库设计中除了一对多关联最为常见外,多对多的关联也经常看到,如果我们想要通过Code First定义出多对多的关联表格,只要调整一下数据模型内的导航属性即可,也就是将单一对象改成集合对象的类型即可。将上述代码中的Guestbook类型中的以下行:
public Member Member { get; set;}
更改为以下行:
public ICollection<Member> Members { get; set; }
当程序运行后,你会发现数据库中的多对多关联也被完整创建了,如图所示。
public class Guestbook
{
public int GuestbookId { get; set; }
[Required]
public string Message { get; set; }
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public DateTime CreatedOn { get; set; }
public ICollection<Member> Members { get; set; }
}
public class Member
{
public int Id { get; set; }
[Required]
[MaxLength(5)]
public string Name { get; set; }
[MaxLength(200)]
public string Email { get; set; }
public ICollection<Guestbook> Guestbooks { get; set; }
}
3.设计模型之间一对一关联
public class Guestbook
{
public int GuestbookId { get; set; }
[Required]
public string Message { get; set; }
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public DateTime CreatedOn { get; set; }
public int MemberId{get;set;}
public Member Member { get; set; }
}
public class Member
{
public int Id { get; set; }
[Required]
[MaxLength(5)]
public string Name { get; set; }
[MaxLength(200)]
public string Email { get; set; }
public int GuestbookId{get;set;}
public Guestbook Guestbook{get;set;}
}