一、Modeling a Many-to-Many Relationship with No Payload

1. 创建数据库表

CREATE TABLE [Album]
(
[AlbumId] [int] NOT NULL IDENTITY(1, 1),
[AlbumName] [varchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL
) ON [PRIMARY]
GO
ALTER TABLE [Album] ADD CONSTRAINT [PK_Album] PRIMARY KEY CLUSTERED ([AlbumId]) ON [PRIMARY]
GO CREATE 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]
GO
ALTER TABLE [Artist] ADD CONSTRAINT [PK_Artist] PRIMARY KEY CLUSTERED ([ArtistId]) ON [PRIMARY]
GO CREATE TABLE [LinkTable]
(
[ArtistId] [int] NOT NULL,
[AlbumId] [int] NOT NULL
) ON [PRIMARY]
GO
ALTER TABLE [LinkTable] ADD CONSTRAINT [PK_LinkTable] PRIMARY KEY CLUSTERED ([ArtistId], [AlbumId]) ON [PRIMARY]
GO
ALTER TABLE [LinkTable] ADD CONSTRAINT [FK_LinkTable_Album] FOREIGN KEY ([AlbumId]) REFERENCES [Album] ([AlbumId])
GO
ALTER TABLE [LinkTable] ADD CONSTRAINT [FK_LinkTable_Artist] FOREIGN KEY ([ArtistId]) REFERENCES [Artist] ([ArtistId])
GO

Create Table

表关系图:

2. 创建实体模型,如图

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

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

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

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

3. 操作实体类

 using System;

 namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
//Insert
using (var context = new test2Entities())
{
//添加一个艺术家属于2个专辑
var artist = new Artist { FirstName = "Alan", LastName = "Jackson" };
var album1 = new Album { AlbumName = "Drive" };
var album2 = new Album { AlbumName = "Live at Texas Stadium" };
artist.Albums.Add(album1);
artist.Albums.Add(album2);
context.Artists.Add(artist); //添加一个专辑有2个艺术家
var artist1 = new Artist { FirstName = "Tobby", LastName = "Keith" };
var artist2 = new Artist { FirstName = "Merle", LastName = "Haggard" };
var album = new Album { AlbumName = "Honkytonk University" };
artist1.Albums.Add(album);
artist2.Albums.Add(album);
context.Albums.Add(album); context.SaveChanges();
} //Select
using (var context = new test2Entities())
{
Console.WriteLine("艺术家和他们的专辑...");
var artists = context.Artists;
foreach (var artist in artists)
{
Console.WriteLine("{0} {1}", artist.FirstName, artist.LastName);
foreach (var album in artist.Albums)
{
Console.WriteLine("\t{0}", album.AlbumName);
}
} Console.WriteLine("\n专辑中的艺术家...");
var albums = context.Albums;
foreach (var album in albums)
{
Console.WriteLine("{0}", album.AlbumName);
foreach (var artist in album.Artists)
{
Console.WriteLine("\t{0} {1}", artist.FirstName, artist.LastName);
}
}
}
Console.ReadKey();
}
}
}

输出:

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

二、Modeling a Many-to-Many Relationship with a Payload

1. 创建数据库表:

CREATE TABLE [Order]
(
[OrderId] [int] NOT NULL,
[OrderDate] [datetime] NOT NULL
) ON [PRIMARY]
GO ALTER TABLE [Order] ADD CONSTRAINT [PK_Order] PRIMARY KEY CLUSTERED ([OrderId]) ON [PRIMARY]
GO
CREATE TABLE [Item]
(
[SKU] [int] NOT NULL,
[Description] [varchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL,
[Price] [decimal] (18, 2) NOT NULL
) ON [PRIMARY]
GO
ALTER TABLE [Item] ADD CONSTRAINT [PK_Item] PRIMARY KEY CLUSTERED ([SKU]) ON [PRIMARY]
GO
CREATE TABLE [OrderItem]
(
[OrderId] [int] NOT NULL,
[SKU] [int] NOT NULL,
[Count] [int] NOT NULL
) ON [PRIMARY]
GO
ALTER TABLE [OrderItem] ADD CONSTRAINT [PK_OrderItem] PRIMARY KEY CLUSTERED ([OrderId], [SKU]) ON [PRIMARY]
GO
ALTER TABLE [OrderItem] ADD CONSTRAINT [FK_OrderItem_Item] FOREIGN KEY ([SKU]) REFERENCES [Item] ([SKU])
GO
ALTER TABLE [OrderItem] ADD CONSTRAINT [FK_OrderItem_Order] FOREIGN KEY ([OrderId]) REFERENCES [Order] ([OrderId])
GO

Create Table

表关系图:

创建模型图:

这回连接表有了实体了,为什么呢?因为OrderItem表有自己的字段Count

3. 操作实体类:

using System;

namespace ConsoleApplication4
{
class Program
{
static void Main(string[] args)
{
//Add
using (var context = new test2Entities())
{
var order = new Order { OrderId = , OrderDate = new DateTime(, , ) }; var item = new Item { SKU = , Description = "Backpack", Price = 29.97M };
var oi = new OrderItem { Order = order, Item = item, Count = };
context.Items.Add(item);
context.OrderItems.Add(oi); item = new Item { SKU = , Description = "Water Filter", Price = 13.97M };
oi = new OrderItem { Order = order, Item = item, Count = };
context.Items.Add(item);
context.OrderItems.Add(oi); item = new Item { SKU = , Description = "Camp Stove", Price = 43.99M };
oi = new OrderItem { Order = order, Item = item, Count = };
context.Items.Add(item);
context.OrderItems.Add(oi); context.Orders.Add(order);
context.SaveChanges();
} //Select
using (var context = new test2Entities())
{
foreach (var order in context.Orders)
{
Console.WriteLine("Order # {0}, ordered on {1}", order.OrderId.ToString(), order.OrderDate.ToShortDateString());
Console.WriteLine("SKU\tDescription\tQty\tPrice");
Console.WriteLine("---\t-----------\t---\t-----");
foreach (var oi in order.OrderItems)
{
Console.WriteLine("{0}\t{1}\t{2}\t{3}", oi.Item.SKU, oi.Item.Description, oi.Count.ToString(), oi.Item.Price.ToString("C"));
}
}
}
Console.ReadKey();
}
}
}

Entity Framework 6.x 学习之 - 创建带连接表的实体模型 with Database First的更多相关文章

  1. Entity Framework Code First学习系列目录

    Entity Framework Code First学习系列说明:开发环境为Visual Studio 2010 + Entity Framework 5.0+MS SQL Server 2012, ...

  2. 关于Entity Framework采用DB First模式创建后的实体批量修改相关属性技巧

    Entity Framework采用DB First模式创建实体是比较容易与方便的,修改已创建的实体在个数不多的情况下也是没问题的,但如果已创建的实体比较多,比如10个实体以上,涉及修改的地方比较多的 ...

  3. Working with Data » Getting started with ASP.NET Core and Entity Framework Core using Visual Studio » 创建复杂数据模型

    Creating a complex data model 创建复杂数据模型 8 of 9 people found this helpful The Contoso University sampl ...

  4. Entity Framework 6.1 学习系列1--概况、安装

    原文:Entity Framework 6.1 学习系列1--概况.安装 Entity Framework:实体框架,看名字就知道是针对模型数据的.这是MS推出的一款ORM工具. 与NHibernat ...

  5. Entity Framework Code First学习系列

    Entity Framework Code First学习系列目录 Entity Framework Code First学习系列说明:开发环境为Visual Studio 2010 + Entity ...

  6. EF(Entity Framework)系统学习系列

    好久没写博客了,继续开启霸屏模式,好了,废话不多说,这次准备重新系统学一下EF,一个偶然的机会找到了一个学习EF的网站(http://www.entityframeworktutorial.net/) ...

  7. Entity Framework with MySQL 学习笔记一(安装)

    声明 :  数据库是Mysql,本人的程度只到会写sql语句(不会储蓄过程), c# 会基本的ADO.NET数据库访问,LINQ基础. 这篇只做个人学习|温习作用. 新手可以参考,也请高手指正错误, ...

  8. Entity framework在用于WCF时创建数据模型的问题

    众所周知,WCF的传输对象,在创建时需要在类名上标识[DataContract]以及在属性上标识[DataMember],当我们在使用Entity framework时(不考虑Code first的情 ...

  9. Entity Framework Code First 学习日记(1)精

    我最近几天正在学习Entity Framework Code First.我打算分享一系列的学习笔记,今天是第一部分: 为什么要使用Code First: 近 年来,随着domain driven d ...

随机推荐

  1. 4、C语言的编译过程链

    在学校学C语言的时候,很多人都不是很注重编译过程链,但是其实编译过程是项目过程中很重要的一部分,有时候有些语法诸如static.volatile等关键词不理解时大多数都是对整个C语言编译链没有进行过详 ...

  2. struts2 18拦截器详解(十)

    ModelDrivenInterceptor 该拦截器处于defaultStack中的第九的位置,在ScopedModelDrivenInterceptor拦截器之后,要使该拦截器有效的话,Actio ...

  3. presto调研和json解析函数的使用

    presto简单介绍 presto是一个分布式的sql交互式查询引擎.可以达到hive查询效率的5到10倍.支持多种数据源的秒级查询. presto是基于内存查询的,这也是它为什么查询快的原因.除了基 ...

  4. Linux-用户及权限

    1. 用户组 RHEL 7/CentOS 7系统中的用户组有如下3类: 超级用户,UID 0:系统的超级用户. 系统用户,UID 1-999:系统中系统服务由不同用户运行,更加安全,默认被限制不能登录 ...

  5. java 异步机制与同步机制的区别

    所谓异步输入输出机制,是指在进行输入输出处理时,不必等到输入输出处理完毕才返回.所以异步的同义语是非阻塞(None Blocking). 网上有很多网友用很通俗的比喻  把同步和异步讲解的很透彻 转过 ...

  6. Windows的cmd窗口显示utf8字符

    用XeLaTeX的时候,查字体需要用fc-list命令,XeLaTeX用的都是utf编码,所以fc-list输出的字体信息也是utf编码.因此需要把cmd窗口也改成utf8编码才能看到这些字体信息.U ...

  7. Android Dagger 2

    Dagger 2 依赖注入 1. 基本概念 最重要有四个概念,也是四个注解(annotation),Provide,Inject,Module,Component. Provide 是提供者,创建实例 ...

  8. scanf的拓展用法——匹配特定字符

    scanf的基本用法除了常规的输入操作外还有一些特殊的用法,使用这些用法可以很方便的在输入中读取想要的数据 1.限制输入数据的长度 这个应该算不上拓展用法,大多数读者应该都曾经使用过,这里简单提一下 ...

  9. VS2017新建视图中文乱码解决办法

    问题:VS2017 ASP.NET Core 新建视频默认为ASNI编码格式 解决办法 1:直接将视图页面通过记事本打开,然后另存为UTF-8解决. 2:安装扩展TextTools解决视图文件编码问题 ...

  10. flask_json数据入库Mongo

    首先我们先导入python内置的json库,用来将接送数据转换为python对象 import json #导入自定义的数据公共库 from db_tool import db #载入库之前先清空数据 ...