Linq To Sql进阶系列(二)M:M关系

在Linq To Sql进阶系列(一) 一文中,我们谈到了数据库中的两种基本关系1:M 与1:1. 而现实世 界中,还有一种M:M 的关系。比如,一个老师可以有多个学生,而一个学生也可以有多个老师。老师和 学生的关系就是多对多的关系。这些关系在数据库中是如何反映的呢?

在C#3.0入门系列(十)-之Join操作一文中,我们提到了M:M 的关系中的join操作。哦,原来,M:M 的关系在数据库中,依然是通过1:M 来体现。比如,在一个域内,一个User可以加入到多个Group中,一 个Group也可以包含多个User。 User与Group并没有直接的关系,而是通过第三个表UserInGroup发生关 系。User与 UserInGroup的关系为1:M,其关系键为UserId, 而Group与 UserInGroup的关系也为1:M, 其 关系键为GroupId,这样,我们通过第三个表,让User与Group发生了关系,他们的关系为M:M.

这三个表的脚本如下:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[User]') AND OBJECTPROPERTY(id, N'IsUserTable') = 1)
BEGIN
CREATE TABLE [dbo].[User](
[UserId] [nchar](10) NOT NULL,
[UserName] [nchar](10) NULL,
  CONSTRAINT [PK_User] PRIMARY KEY CLUSTERED
(
[UserId] ASC
) ON [PRIMARY]
) ON [PRIMARY]
END
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[Group]') AND OBJECTPROPERTY(id, N'IsUserTable') = 1)
BEGIN
CREATE TABLE [dbo].[Group](
[GroupId] [nchar](10) NOT NULL,
[GroupName] [nchar](10) NULL,
  CONSTRAINT [PK_Group] PRIMARY KEY CLUSTERED
(
[GroupId] ASC
) ON [PRIMARY]
) ON [PRIMARY]
END
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[UserInGroup]') AND OBJECTPROPERTY(id, N'IsUserTable') = 1)
BEGIN
CREATE TABLE [dbo].[UserInGroup](
[UserId] [nchar](10) NOT NULL,
[GroupId] [nchar](10) NOT NULL,
  CONSTRAINT [PK_UserInGroup] PRIMARY KEY CLUSTERED
(
[UserId] ASC,
[GroupId] ASC
) ON [PRIMARY]
) ON [PRIMARY]
END
GO
IF NOT EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo]. [FK_UserInGroup_Group]') AND type = 'F')
ALTER TABLE [dbo].[UserInGroup]  WITH CHECK ADD  CONSTRAINT [FK_UserInGroup_Group] FOREIGN KEY([GroupId])
REFERENCES [dbo].[Group] ([GroupId])
GO
ALTER TABLE [dbo].[UserInGroup] CHECK CONSTRAINT [FK_UserInGroup_Group]
GO
IF NOT EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo]. [FK_UserInGroup_User]') AND type = 'F')
ALTER TABLE [dbo].[UserInGroup]  WITH CHECK ADD  CONSTRAINT [FK_UserInGroup_User] FOREIGN KEY([UserId])
REFERENCES [dbo].[User] ([UserId])
GO
ALTER TABLE [dbo].[UserInGroup] CHECK CONSTRAINT [FK_UserInGroup_User]

时间: 2024-11-03 08:35:29

Linq To Sql进阶系列(二)M:M关系的相关文章

Linq To Sql进阶系列

Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的 Linq To Sql进阶系列(六)用object的动态查询与保存log篇 Linq To Sql进阶系列(五)Store Procedure篇 Linq To Sql进阶系列(四)User Define Function篇 Linq To Sql进阶系列(三)CUD和Log Linq To Sql进阶系列(二)M:M关系 Linq To Sql进阶系列(一)-从映射讲起

Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的差别

在上面一篇文章Linq To Sql进阶系列(六)中,我们提到了使用object的动态查询.本文在上文的 基础上,再做更加深入的引申.同时修正上文中一些不妥的地方. 1, object的动态查询续 首先要做的事情,就是将Find的函数改成扩展方法.扩展方法只能放在静态类里,而且它的第一个参 数必须带this关键字.在上文中,作者留下了一个迷题.当需要or条件时,又该如何做呢?本文也将这 个问题给出回答.但是对于动态Like的条件,笔者依然还没有找到一个较好的方法.为了增加or条件, 函数的声明也

Linq To Sql进阶系列(五)Store Procedure篇

Store Procedure,存储过程.也是被别人写过的东西.我习惯性先看别人都写了点啥,然后才开始 想看看自己还要写点啥.那就先谈谈它与udf的区别吧. 在Linq To Sql进阶系列(四)User Define Function篇 中,我们提到了两者的差别.比如Store Procedure支持多个rowset的,而udf不行.他们还有一些其他的差别.Store Procedure只能返回整型, 而udf可以是其他类型,比如char等,除个别类型外,比如imager类型,是不可以做为ud

Linq To Sql进阶系列(一)-从映射讲起

本系列,或多或少,直接或间接依赖入门系列知识.但,依然追求独立成章.因本文作者水平有限, 文中错误难免,敬请读者指出并谅解.本系列将会和入门并存. 案例 某君被邀为一超市设计数据库,用来存储数据.该君根据该超市中实际出现的对象,设计了 Customer, Employee,Order, Product等表,用来保存相应的客户,员工,订单,货品等.太好了,该 君很有oo的思想吗. 如果,你被要求用类及对象,来描述该关系型数据,你该如何做呢?在linq推出之前,ADO.NET被用 来做数据访问层.而

Linq To Sql进阶系列(六)用object的动态查询与保存log篇

动态的生成sql语句,根据不同的条件构造不同的where字句,是拼接sql 字符串的好处.而Linq的推 出,是为了弥补编程中的 Data != Object 的问题.我们又该如何实现用object的动态查询呢? 1,用object的查询是什么? 我们可以简单的举这么一个例子.我们到公安局查找一个人.首先,我们会给出他的一些特征,比如 ,身高多少,年龄多少,性别,民族等.那么,我们把这个人的一些特征输入电脑.我们希望,电脑能 给我们返回这个人的信息.而实际上,有相同特征的人太多了,常常返回一个集

Linq To Sql进阶系列(四)User Define Function篇

User Define Function, 用户自定义函数,简称UDF. 关于sql server中的udf,请大家参考 http://msdn.microsoft.com/msdnmag/issues/03/11/DataPoints/一文.本文主要阐述,在Linq To Sql 中,如何使用UDF. 1,UDF 简介 UDF可以分为两中类型.一种为Scalar Valued Function,简称为SVF,是返回值类型的UDF. 另一种 为Table Valued Function 简称为T

Linq To Sql进阶系列(三)CUD和Log

CUD就是Create, Update, Delete.在别人都写过了后,还有什么是新鲜的呢? 1,CreateDatabase Northwind db = new Northwind("You connection string"); //注意database项,起一个 不存在的数据库名称 db.Log = Console.Out; if (!db.DatabaseExists()) //如果,数据库不存在 db.CreateDatabase(); //创建数据库 这个的好处,就是

步步学LINQ to SQL:为实体类添加关系

本文详细为你阐述了如何在你的应用程序中实现LINQ to SQL.附件的示例程序包括了这里探讨的所有代码,还提供了一个简单的WPF图形界面程序来显示通过数据绑定返回的结果集. 本部分描述如何实现表间的映射关系:M:1,1:M和M:M.但是这里不会讨论1:1的映射关系,你可以在M:1的关系中发现这种1:1的映射关系.因此,从这里开始,我们将使用Book作为示例为你一步一步讲述这一实现过程. 映射M:1的关系 Book 对象与Category 对象是多对一的关系(M:1),因为一本书仅能属于某一个类

Bing Maps进阶系列二:使用GeocodeService进行地理位置检索

一.添加GeocodeService的Web服务引用 地理编码服务(GeocodeService)是以WCF技术发布的一个Web服务,地图编码服务提供了以一个有效的物理地址在地图上匹配其对应的地图地址(既地理经度和纬度坐标)和以地理经度和纬度坐标进行反向匹配物理地址路径的功能.要使用该服务需添加该服务(http://dev.virtualearth.net/webservices/v1/geocodeservice/GeocodeService.svc)的Web服务引用,如下图: 从上图可以清晰