1.无载荷(with NO Payload)的多对多关系建模

在数据库中,存在通过一张链接表来关联两张表的情况。链接表仅包含连接两张表形成多对多关系的外键,你需要把这两张多对多关系的表导入到实体框架模型中。

1.1 假设我们有如下数据关系:

entityframework学习笔记--004-无载荷与有载荷关系

我们有三张表用来存储Album(专辑)、Artist(艺人)、LinkTable(专辑与艺人的关系表)。一张“专辑”可以有多个“艺人”,同时一个“艺人”也可以有多张专辑。

1.2 右键你的项目,使用entityframework的database first创建实体模型。注意把这三张表都选上,当点击“完成”之后,实体框架生成的视图如图4-1

entityframework学习笔记--004-无载荷与有载荷关系

图4-1

1.3 观察图4-1可以发现,Album与Artist之间的关系被映射成了一条多对多的直线,而当初选择的LinkTable表没有出现在视图中。这是因为LinkTable中没有标量属性,也就是说没有载荷。实体框架认为,LinkTable存在的意义就是表示Album与Artist之间的关系的,而上图足以表示他两的关系,所以LinkTable就没有存在的必要了。但是如果LinkTable中有标量属性,实体框架则会为他创建相应的模型,如下一节2.1。

1.4 对上述关系的插入与查询测试。输出如图4-2

 1 using (var context = new ef6recipesEntities())
 2             {
 3 
 4                 // 添加一个拥有两张专辑的艺术家 
 5                 var artist = new Artist { FirstName = "Alan", LastName = "Jackson" };
 6                 var album1 = new Album { AlbumName = "Drive" };
 7                 var album2 = new Album { AlbumName = "Live at Texas Stadium" };
 8                 artist.Albums.Add(album1);
 9                 artist.Albums.Add(album2);
10                 context.Artists.Add(artist);
11 
12                 //添加两个艺术家的专辑
13                 var artist1 = new Artist { FirstName = "Tobby", LastName = "Keith" };
14                 var artist2 = new Artist { FirstName = "Merle", LastName = "Haggard" };
15                 var album = new Album { AlbumName = "Honkytonk University" };
16                 artist1.Albums.Add(album);
17                 artist2.Albums.Add(album);
18                 context.Artists.Add(artist1); 
19                 context.Artists.Add(artist2);
20 
21                 context.SaveChanges();
22             }
23 
24             using (var context = new ef6recipesEntities())
25             {
26                 Console.WriteLine("Artists and their albums...");
27                 var artists = context.Artists;
28                 foreach (var artist in artists)
29                 {
30                     Console.WriteLine("{0} {1}", artist.FirstName, artist.LastName);
31                     foreach (var album in artist.Albums)
32                     {
33                         Console.WriteLine("\t{0}", album.AlbumName);
34                     }
35                 }
36                 Console.WriteLine("\nAlbums and their artists...");
37                 var albums = context.Albums;
38                 foreach (var album in albums)
39                 {
40                     Console.WriteLine("{0}", album.AlbumName);
41                     foreach (var artist in album.Artists)
42                     {
43                         Console.WriteLine("\t{0} {1}", artist.FirstName, artist.LastName);
44                     }
45                 }
46             }
View Code

相关文章: