首页 > 代码库 > Entity Framework 6.x 学习之 - 创建带连接表的实体模型 with Database First

Entity Framework 6.x 学习之 - 创建带连接表的实体模型 with Database First

1. 创建数据库表

CREATE TABLE [Album]([AlbumId] [int] NOT NULL IDENTITY(1, 1),[AlbumName] [varchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL) ON [PRIMARY]GOALTER TABLE [Album] ADD CONSTRAINT [PK_Album] PRIMARY KEY CLUSTERED  ([AlbumId]) ON [PRIMARY]GOCREATE TABLE [Artist]([ArtistId] [int] NOT NULL IDENTITY(1, 1),[FirstName] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL,[MiddleName] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL,[LastName] [varchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL) ON [PRIMARY]GOALTER TABLE [Artist] ADD CONSTRAINT [PK_Artist] PRIMARY KEY CLUSTERED  ([ArtistId]) ON [PRIMARY]GOCREATE TABLE [LinkTable]([ArtistId] [int] NOT NULL,[AlbumId] [int] NOT NULL) ON [PRIMARY]GOALTER TABLE [LinkTable] ADD CONSTRAINT [PK_LinkTable] PRIMARY KEY CLUSTERED  ([ArtistId], [AlbumId]) ON [PRIMARY]GOALTER TABLE [LinkTable] ADD CONSTRAINT [FK_LinkTable_Album] FOREIGN KEY ([AlbumId]) REFERENCES [Album] ([AlbumId])GOALTER TABLE [LinkTable] ADD CONSTRAINT [FK_LinkTable_Artist] FOREIGN KEY ([ArtistId]) REFERENCES [Artist] ([ArtistId])GO
Create Table

表关系图:

2. 创建实体模型,如图

备注:明明选了3个表,为什么只有2个实体呢?

因为中间那个表为连接表,所以在映射实体的时候只有2个实体,这种情况叫 no payload 。

为什么连接表不会被创建成一个实体呢?

因为他没有自己的主键,如果给链接表加一个主键,那么创建的实体模型就会和数据库表关系一样,一个一个的对应上。

3. 操作实体类

 1 using System; 2  3 namespace ConsoleApplication3 4 { 5     class Program 6     { 7         static void Main(string[] args) 8         { 9             //Insert10             using (var context = new test2Entities())11             {12                 //添加一个艺术家属于2个专辑13                 var artist = new Artist { FirstName = "Alan", LastName = "Jackson" };14                 var album1 = new Album { AlbumName = "Drive" };15                 var album2 = new Album { AlbumName = "Live at Texas Stadium" };16                 artist.Albums.Add(album1);17                 artist.Albums.Add(album2);18                 context.Artists.Add(artist);19 20                 //添加一个专辑有2个艺术家21                 var artist1 = new Artist { FirstName = "Tobby", LastName = "Keith" };22                 var artist2 = new Artist { FirstName = "Merle", LastName = "Haggard" };23                 var album = new Album { AlbumName = "Honkytonk University" };24                 artist1.Albums.Add(album);25                 artist2.Albums.Add(album);26                 context.Albums.Add(album);27 28                 context.SaveChanges();29             }30 31             //Select32             using (var context = new test2Entities())33             {34                 Console.WriteLine("艺术家和他们的专辑...");35                 var artists = context.Artists;36                 foreach (var artist in artists)37                 {38                     Console.WriteLine("{0} {1}", artist.FirstName, artist.LastName);39                     foreach (var album in artist.Albums)40                     {41                         Console.WriteLine("\t{0}", album.AlbumName);42                     }43                 }44 45                 Console.WriteLine("\n专辑中的艺术家...");46                 var albums = context.Albums;47                 foreach (var album in albums)48                 {49                     Console.WriteLine("{0}", album.AlbumName);50                     foreach (var artist in album.Artists)51                     {52                         Console.WriteLine("\t{0} {1}", artist.FirstName, artist.LastName);53                     }54                 }55             }56             Console.ReadKey();57         }58     }59 }

输出:

程序运行3次后的数据库表结果: