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;}
}

 

posted @ 2015-10-08 23:20  RunningYY  阅读(691)  评论(2编辑  收藏  举报