精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

LINQ to SQL多對多表間關系的維護方法

開發 后端
我們經常會碰到維護多對多(many to many)關系表間關系的操作,本文將介紹的是相關的維護方法。

在項目開發中,經常會碰到維護多對多(many to many)關系表間關系的操作,例如為人員配置角色、為人員配置部門、為產品配置類別等。如果沒有經過程序設計而直接進行開發,將會過多地關注其細節問題,如:應刪除那些數據、應添加哪些數據、應保留哪些數據等,導致開發效率降低。

名詞解釋

在本文開始之前,首先以用戶-用戶角色-角色表為例,聲明三個概念:

clip_image004

l  主表:如果為用戶配置角色,那么用戶就是主表;如果為角色配置用戶,那么角色就是主表。

l  從表:如果為用戶配置角色,那么角色就是從表。

l  關系表:記錄用戶與角色表間關系的表。

行為描述

經過總結,發現其行為有統一的地方:傳遞主表對象與從表對象集合->獲取現有關系->對比出要刪除的關系->對比出要添加的關系->提交更改。

在下面的文章中,將一步步介紹完成的過程。

測試用例

使用ASP.NET網站程序,新建如下圖所示的頁面:

clip_image006

在左側的用戶選擇DropDownList中,選擇一個現有用戶后,會在右側的CheckBoxList中顯示其具有的角色。在進行完配置后,可以點擊上方的”保存”LinkButton進行保存。

下面我將4以種情況,來展示這個示例。在每個操作完成后,我們執行以下腳本,來查看操作是否成功:

腳本:

  1. SELECT * FROM [dbo].[UsersInRoles] 

開始測試前:

clip_image008

添加一個關系

在本次操作中,將為馬六配置一個“Java程序員”的角色。

clip_image010

點擊保存后,查看數據庫數據:

clip_image012

可以看到,已經成功添加一個關系。

添加兩個關系,其中一個將新建,一個不做處理

在本次操作中,將為馬六配置 “Java程序員 + .NET程序員”的角色。

clip_image014

點擊保存后,查看數據庫數據:

clip_image016

可以看到數據庫中的關系數據變為了兩條,并且RoleID為“63B04…”的關系數據的主鍵“064AB…”并沒有發生改變,這說明我并沒有做“全部刪除,再全部添加”的暴力型操作。

添加兩個關系,其中一個將新建,一個不做處理,一個將刪除

在本次操作中,將為馬六配置 “Java程序員 + 項目經理”的角色。

clip_image018

點擊保存后,查看數據庫數據:

clip_image020

可以看到RoleID為“71DFA…”的關系被刪除了,而且新建了一個RoleID為“3F45B…”的關系,而RoleID為“63B04…”的關系沒有發生改變。操作成功完成。

刪除所有關系

在本次操作中,將馬六的全部角色置空。

clip_image022

點擊保存后,查看數據庫數據:

clip_image024

可以看到用戶的關系被全部刪除了。至此,測試工作告一段落,開始介紹功能是如何完成的。

在點擊保存按鈕時,要做的就是將選中的用戶,以及為其配置的角色保存到數據庫中。有過這樣的開發經驗的開發人員會知道這個過程還是十分繁瑣的,在下面的代碼中,我將使用設計后的方式來完成這個操作:

  1. /// <summary>  
  2. /// 點擊保存按鈕時的操作  
  3. /// </summary>  
  4. protected void btnSave_Click(object sender, EventArgs arg)  
  5. {  
  6. Users user = DataContext.Users.SingleOrDefault(e => e.UserID == new Guid(ddlUsers.SelectedValue));  
  7.     List<Roles> roles = new List<Roles>();  
  8.     foreach (ListItem item in cblUserRoles.Items)  
  9.     {  
  10.         if (item.Selected)  
  11.         {  
  12.     Roles role = DataContext.Roles.SingleOrDefault(e => e.RoleID == new Guid(item.Value));  
  13.             if (role != null)  
  14.             {  
  15.                 roles.Add(role);  
  16.             }  
  17.         }  
  18.     }  
  19.     LinqM2MProvider.Execute(user, roles, true);  

可以看到,除了封裝參數(用戶對象,角色對象集合)的常規操作外,只調用了一個方法:LinqM2MProvider.Execute(user, roles, true)。那么這個LinqM2MProvider是什么呢?答案是一個接口,下面的代碼介紹了這個接口的構造方法:

  1. /// <summary>  
  2. /// 管理用戶-用戶角色-角色之間關系的提供程序  
  3. /// </summary>  
  4. public ILinqM2MProvider<Users, UsersInRoles, Roles> LinqM2MProvider  
  5. {  
  6.     get 
  7.     {  
  8.         var provider = new LinqM2MProvider<Users, UsersInRoles, Roles>()  
  9.         {  
  10.             DataContext = this.DataContext,  
  11.  GetRelationHandler = (m, s) => DataContext.UsersInRoles.SingleOrDefault(e => e.UserID == m.UserID && e.RoleID == s.RoleID),  
  12.             RelationSetHandler = m => m.UsersInRoles,  
  13.             CreateRelationHandler = (m, s) => new UsersInRoles()  
  14.             {  
  15.                 UserInRoleID = Guid.NewGuid(),  
  16.                 Users = m,  
  17.                 Roles = s  
  18.             }  
  19.         };  
  20.         return provider;  
  21.     }  

可以看到ILinqM2MProvider接口是一個泛型接口,它的三個泛型類型是用戶-用戶角色-角色,就跟本文“名詞解釋”段落中的圖片所顯示關系一致。使用它需要設置四個屬性:

l  DataContext

l  GetRelationHandler

l  RelationSetHandler

l  CreateRelationHandler

那么這個四個屬性分別代表什么含義呢?下文將進行詳細的說明。

接口ILinqM2MProvider<M, R, S>

定義

  1. /// <summary> 
  2. /// 維護LINQ to SQL的多對多關聯關系  
  3. /// </summary> 
  4. /// <typeparam name="M">主表類型</typeparam> 
  5. /// <typeparam name="R">關系表類型</typeparam> 
  6. /// <typeparam name="S">從表類型</typeparam> 
  7. /// <remarks> 
  8. /// Sunny D.D at 2010-8-20  
  9. /// sunny19788989@gmail.com  
  10. /// </remarks> 
  11. public interface ILinqM2MProvider<M, R, S> 
  12.     where M : class  
  13.     where R : class  
  14.     where S : class  
  15. {  
  16.     /// <summary> 
  17.     /// LINQ to SQL入口  
  18.     /// </summary> 
  19.     DataContext DataContext { get; set; }  
  20.     /// <summary> 
  21.     /// 描述如何根據主表對象和從表對象獲取中間關系表對象的行為  
  22.     /// </summary> 
  23.     Func<M, S, R> GetRelationHandler { get; set; }  
  24.     /// <summary> 
  25.     /// 描述如何根據主表對象和從表對象創建中間關系表對象的行為  
  26.     /// </summary> 
  27.     Func<M, S, R> CreateRelationHandler { get; set; }  
  28.     /// <summary> 
  29.     /// 描述如何根據主表對象獲取獲取中間關系表對象集合  
  30.     /// </summary> 
  31.     Func<M, EntitySet<R>> RelationSetHandler { get; set; }  
  32.     /// <summary> 
  33.     /// 獲取將要刪除的關系  
  34.     /// </summary> 
  35.     /// <param name="master">主表對象</param> 
  36.     /// <param name="slaves">從表對象</param> 
  37.     /// <returns></returns> 
  38.     IEnumerable<R> GetDeleting(M master, IEnumerable<S> slaves);  
  39.     /// <summary> 
  40.     /// 獲取將要新建的關系  
  41.     /// </summary> 
  42.     /// <param name="master">主表對象</param> 
  43.     /// <param name="slaves">從表對象</param> 
  44.     /// <returns></returns> 
  45.     IEnumerable<R> GetAdding(M master, IEnumerable<S> slaves);  
  46.     /// <summary> 
  47.     /// 執行操作。默認在方法結束時不將變更提交至數據庫,需要顯式提交變更。  
  48.     /// </summary> 
  49.     /// <param name="master">主表對象</param> 
  50.     /// <param name="slaves">從表對象</param> 
  51.     void Execute(M master, IEnumerable<S> slaves);  
  52.     /// <summary> 
  53.     /// 執行操作  
  54.     /// </summary> 
  55.     /// <param name="master">主表對象</param> 
  56.     /// <param name="slaves">從表對象</param> 
  57.     /// <param name="isSubmitChanges">是否在方法結束時將變更提交至數據庫</param> 
  58.     void Execute(M master, IEnumerable<S> slaves, bool isSubmitChanges);  

DataContext屬性

類型:System.Data.Linq.DataContext

RelationSetHandler屬性

描述如何根據主表對象獲取獲取中間關系表對象集合。

在LINQ to SQL架構中,一個表的外鍵對象集合是用EntitySet來表示的,EntitySet中的元素代表著主鍵表關聯的外建表的條目。在本文的“測試用例”部分中,是這樣賦值的:

RelationSetHandler = m => m.UsersInRoles

GetRelationHandler屬性

描述如何根據主表對象和從表對象獲取中間關系表對象的行為。在本文中,就是根據用戶ID與角色ID獲取一個UsersInRoles對象。

它的作用是確定有多少個中間表對象需要被操作。當然,最后提交至數據庫的元素,是與RelationSetHandler操作結果中包含的元素進行比對后才被執行的。在本文的“測試用例”部分中,是這樣賦值的:

GetRelationHandler = (m, s) => DataContext.UsersInRoles.SingleOrDefault(e => e.UserID == m.UserID && e.RoleID == s.RoleID)

CreateRelationHandler屬性

描述如何根據主表對象和從表對象創建中間關系表對象的行為。

在傳遞的從表集合中,發現有需要新建的關系時,就要用到這個操作。在本文的“測試用例”部分中,是這樣賦值的:

  1. CreateRelationHandler = (m, s) => new UsersInRoles()  
  2. {  
  3.     UserInRoleID = Guid.NewGuid(),  
  4.     Users = m,  
  5.     Roles = s  

GetDeleting方法

獲取將要刪除的關系。

GetAdding方法

獲取將要新建的關系。

Execute方法

執行操作。

接口的實現LinqM2MProvider<M, R, S>

至于接口的實現,各位肯定都有自己的方式,在這里我就不詳細說明了,本文給出一個實現僅供參考。下載地址:https://docs.google.com/leaf?id=0B9T0APtVi1fyNGE3ODA5YjctZmIwZC00MjU3LTg5NmYtNGIxZWI0OGI1OTkz&hl=zh_CN

總結

使用本文中介紹的方式來管理多對多表間關系,就可以不關注操作到底是進行添加關系、刪除關系、還是更改關系了,開發人員需要做的只是將三個委托GetRelationHandler、CreateRelationHandler、RelationSetHandler構造好,并傳遞正確的參數(主表對象、從表集合)即可,從而不再關注操作細節,提高開發效率。

原文標題:維護LINQ to SQL多對多表間關系

鏈接:http://www.cnblogs.com/sunnycoder/archive/2010/08/22/1805875.html

【編輯推薦】

  1. Linq匿名類型簡單概述
  2. Linq隨機讀取數據淺析
  3. Linq Lambda表達式全面分析
  4. Linq擴展方法簡單分析
  5. 初探Linq局部變量類型
責任編輯:彭凡 來源: 博客園
相關推薦

2009-09-17 17:34:23

linq to sql

2009-09-15 10:35:11

linq多表查詢

2009-09-15 13:28:49

LINQ表間關系查詢

2009-09-17 18:05:15

linq to sql

2009-09-17 17:14:54

linq to sql

2009-09-15 11:29:04

LINQ to SQL

2010-10-21 11:10:57

SQL Server查

2009-06-04 16:14:22

Hibernate一對Hibernate一對Hibernate多對

2009-06-03 16:27:27

Hibernate一對一關系

2009-06-18 14:22:06

Hibernate多對Hibernate

2021-03-16 09:23:25

VueMixin模塊

2010-10-08 13:56:32

2010-07-01 12:56:07

SQL Server表

2009-09-09 16:07:16

Linq實體關系

2009-09-16 09:56:42

LINQ to SQL

2021-04-12 18:14:56

鴻蒙HarmonyOS應用開發

2009-09-08 14:45:24

Linq to SQL支持SQL Serve

2023-06-12 08:09:01

FlaskSQLAlchemy

2009-09-15 17:07:24

Linq To SQL

2009-09-10 11:29:00

LINQ to SQL
點贊
收藏

51CTO技術棧公眾號

自慰无码一区二区三区| 亚洲综合大片69999| av网站免费在线播放| 超碰国产一区| 欧美国产丝袜视频| 亚洲a级在线观看| 日本一区二区不卡在线| 国产探花在线精品| 欧美一区二区视频在线观看2022| 久久99久久99精品| 狠狠色伊人亚洲综合网站l| 蜜臀久久久99精品久久久久久| 久久影院模特热| 7788色淫网站小说| 日本在线一区二区| 亚欧色一区w666天堂| 亚洲不卡1区| 国产91免费看| 美女久久久精品| 国模精品系列视频| 任我爽在线视频| 狼人天天伊人久久| 欧美在线视频日韩| 黄色激情在线视频| 日本在线视频网| 久久天堂av综合合色蜜桃网| 91日韩久久| 欧美人一级淫片a免费播放| 欧美成人久久| 国产一区二区三区在线观看视频 | 亚洲综合精品| 久久国产精品影片| 农村老熟妇乱子伦视频| 色婷婷久久久| 亚洲高清一二三区| 九九九久久久久久久| 欧美另类激情| 在线观看成人免费视频| 国产亚洲欧美在线视频| 先锋成人av| 亚洲视频小说图片| 一区二区免费在线观看| 成人在线免费看| 2014亚洲片线观看视频免费| 亚洲在线观看视频| 国产精品视频一区二区三区,| 日韩av二区在线播放| 热99在线视频| 亚洲婷婷综合网| 国产一区二区三区久久| 海角国产乱辈乱精品视频| 青青草在线观看视频| 婷婷丁香综合| 久久久成人精品| 亚洲伦理一区二区三区| 欧美wwwww| 久久人人爽人人爽爽久久| 网站永久看片免费| 国产精品毛片一区二区在线看| 色婷婷av一区二区三区在线观看 | 成人黄色在线观看视频| 国产成人综合在线| 国产精品久久7| 熟妇人妻中文av无码| 99免费精品视频| 久久精品一区二区三区不卡免费视频| 黄片毛片在线看| 99久久99久久综合| 久久亚洲午夜电影| 国产三级视频在线看| 国产免费成人在线视频| 亚洲免费视频一区| 国产激情在线视频| 亚洲午夜一区二区三区| 日韩国产一级片| www.com.cn成人| 欧美色爱综合网| 超碰中文字幕在线观看| 国产厕拍一区| 亚洲欧美国产视频| 三级影片在线观看| 国产综合激情| 国产91网红主播在线观看| 特级西西444www高清大视频| 精品在线免费观看| 国产成人免费观看| 国产一二三区在线视频| 香蕉视频免费在线播放| 美女高潮久久久| 99porn视频在线| 亚州男人的天堂| 国产精品视频一二三区| 中国老女人av| 国产在线美女| 欧美日韩国产影片| 亚洲中文字幕无码一区| 精品产国自在拍| 欧美成人激情在线| 特级西西444www大精品视频免费看| 全部av―极品视觉盛宴亚洲| 97超级碰碰| 国产福利第一视频在线播放| 一区二区三区精品在线| av天堂永久资源网| 国产欧美88| 亚洲欧美日韩精品| 三级影片在线看| 日韩国产欧美三级| 成人三级视频在线观看一区二区| 欧洲天堂在线观看| 亚洲一区二区视频| 伊人国产在线视频| 国产真人无遮挡作爱免费视频| 校园激情久久| 亚洲在线一区二区| 理论在线观看| 亚洲国产精品一区二区www在线| 妓院一钑片免看黄大片| 成人av激情人伦小说| 中文字幕不卡在线视频极品| 日韩欧美国产亚洲| 黄网站免费久久| 日本欧洲国产一区二区| 国产经典三级在线| 欧美精品一二三| 天天躁日日躁aaaxxⅹ| 激情av一区| 97在线中文字幕| 欧美激情视频在线播放| 日韩欧美国产骚| 师生出轨h灌满了1v1| 国产精品不卡| 国产一区红桃视频| 亚洲xxxxxx| 欧美私人免费视频| 成人午夜福利一区二区| 国产手机视频一区二区| 国产精品一区二区免费| 69成人在线| 69堂成人精品免费视频| 国产又粗又长又硬| 日本vs亚洲vs韩国一区三区 | 国产一伦一伦一伦| 亚洲免费观看高清完整版在线观| 欧美精品xxx| 亚洲精品一级片| 一卡二卡欧美日韩| 91亚洲一线产区二线产区| 欧美在线91| 99中文字幕| 国产经典三级在线| 亚洲国内精品在线| 91av在线免费视频| 久久只精品国产| www黄色在线| 日韩欧美大片| 成人在线视频网站| 成a人片在线观看| 日韩欧美一二三区| 久久丫精品久久丫| 99视频超级精品| 成年人视频在线免费| 精品一级毛片| 91精品久久久久久久久久久| 成人福利片网站| 欧美xxxx老人做受| 日本一级一片免费视频| 91女人视频在线观看| 国产淫片av片久久久久久| 精品国产1区| 成人在线国产精品| 蜜桃传媒在线观看免费进入| 亚洲国产97在线精品一区| 91九色丨porny丨肉丝| 久久理论电影网| 国产三级国产精品国产专区50| 99国产精品免费视频观看| 97国产超碰| 欧美调教sm| 伊人青青综合网站| 精品国产伦一区二区三区| 午夜天堂影视香蕉久久| brazzers精品成人一区| 精品综合免费视频观看| 男人天堂手机在线视频| 欧美另类69xxxxx| 91系列在线观看| 国模私拍一区二区国模曼安| 日韩精品视频免费专区在线播放| 在线观看免费视频一区| 一区二区久久久久久| 国产交换配乱淫视频免费| 精品在线播放免费| 18禁男女爽爽爽午夜网站免费 | 国产va亚洲va在线va| 国产日产精品一区二区三区四区的观看方式 | 亚洲午夜精品久久久中文影院av| 日韩有吗在线观看| 国产成人精品免费久久久久 | 国产精品久久久久999| 18+激情视频在线| 日韩精品亚洲元码| 国产美女明星三级做爰| 精品福利免费观看| 国产一区二区精彩视频| 国产亚洲午夜高清国产拍精品 | 久久久久久电影| 亚洲综合在线一区二区| 久久久久在线| 日韩亚洲欧美视频| 91tv官网精品成人亚洲| 日本不卡一区二区三区在线观看 | 在线观看v片| 免费av一区二区| 国产精品一区二区婷婷| 亚洲国产精品久久久久久| 国产又粗又长又黄| 色av一区二区| 国产网友自拍视频| 亚洲日本在线视频观看| 国产精品免费无码| 94色蜜桃网一区二区三区| 久久久久亚洲av无码麻豆| 久久精品国产一区二区三区免费看| 99视频在线免费播放| 亚洲欧美伊人| 免费看啪啪网站| 成久久久网站| 欧美一区国产一区| 欧美尿孔扩张虐视频| aaa级精品久久久国产片| 亚洲综合视频| 国产精品香蕉av| 美女网站视频一区| 国产mv免费观看入口亚洲| h片在线观看下载| 欧美激情视频在线免费观看 欧美视频免费一 | 懂色av蜜臀av粉嫩av分享吧最新章节| 亚洲二区在线视频| 国产在线欧美在线| 洋洋成人永久网站入口| 亚洲av鲁丝一区二区三区| 国产精品成人免费在线| 国产精品久久久视频| 国产亚洲成年网址在线观看| 国产精品高清无码在线观看| 久久综合狠狠综合久久综合88| 亚洲av成人片色在线观看高潮 | 欧美一区二区播放| 91亚洲精品国偷拍自产在线观看| 欧美亚一区二区| 影音先锋国产在线| 欧美亚洲一区二区三区四区| 日本成人一级片| 欧美日韩国产美| 国产农村妇女毛片精品| 91精品国产品国语在线不卡| 精品久久久无码中文字幕| 日韩欧美三级在线| 高清一区二区三区四区| 亚洲精品成人久久| 男女视频在线观看免费| 尤物yw午夜国产精品视频明星| www亚洲人| 久久五月情影视| 国模私拍视频在线播放| 久久久久久久香蕉网| 水蜜桃在线视频| 国产精品观看在线亚洲人成网| 色综合.com| 99国精产品一二二线| 秋霞影院一区二区三区| 美国av一区二区三区| 日韩精品网站| 国产美女永久无遮挡| 校园激情久久| 99精品999| thepron国产精品| 91视频免费在观看| 亚洲女人****多毛耸耸8| 国产精品30p| 91福利社在线观看| 99在线小视频| 亚洲精品视频中文字幕| 思思99re6国产在线播放| 欧美激情中文字幕乱码免费| 欧美日韩大片| 91在线国产电影| 欧美一区二区三区红桃小说| 亚洲欧美成人一区| 亚洲美女毛片| 伊人色在线观看| 91香蕉视频mp4| 婷婷激情四射网| 一本大道综合伊人精品热热| 国产女同91疯狂高潮互磨| 亚洲精品久久久久久久久久久久久 | 中文字幕欧美激情一区| 日本少妇激情视频| 欧美日韩夫妻久久| 色鬼7777久久| 久久国产精品久久精品| 午夜日韩成人影院| 国产精品国产精品| 日韩欧美高清在线播放| 国产精品一区二区免费在线观看| 精品一区二区三区在线观看国产| 色呦呦一区二区| 亚洲免费在线视频一区 二区| 三级网站在线播放| 精品电影一区二区三区 | 亚洲欧美偷拍另类a∨色屁股| 国产情侣自拍av| 日韩欧美国产小视频| 在线免费黄色| 日本亚洲欧美成人| 国产欧美三级电影| www.69av| 黄一区二区三区| 性爱在线免费视频| 一本色道久久综合精品竹菊| 国产综合视频在线| 美日韩丰满少妇在线观看| 成人做爰免费视频免费看| 狼狼综合久久久久综合网| 好看的日韩av电影| 中文字幕在线视频一区二区| 国产精品色在线| 中文字幕第315页| 精品亚洲一区二区三区四区五区| 男女视频在线| caoporen国产精品| 综合视频在线| 国产乱叫456| 中文字幕亚洲区| 一级片视频网站| 日韩在线观看免费全| 懂色aⅴ精品一区二区三区| 日本一区二区三不卡| 久久亚洲风情| 色无极影院亚洲| 色欧美片视频在线观看在线视频| 天天操天天干天天操| 91精品国产九九九久久久亚洲| 国产精品22p| 国产极品尤物在线| av不卡在线播放| 天堂网av手机版| 日韩美女av在线| 成人午夜视屏| 青青影院一区二区三区四区| 久久人人超碰| 日本一卡二卡在线播放| 欧美日韩一区精品| 欧美成人高清在线| 91久久爱成人| 亚洲国产专区| 国产人妻人伦精品1国产丝袜| 欧美性videos高清精品| 国模吧精品人体gogo| 国产精品久久久久久久久久小说 | 欧美激情18p| 久久电影在线| 成人在线观看黄| 国产精品乱码人人做人人爱 | 欧美一级中文字幕| av一区二区久久| 狠狠人妻久久久久久综合| 一区二区欧美激情| 成人国产精品久久| 97超碰人人澡| 国产三级精品在线| 国产婷婷一区二区三区久久| 孩xxxx性bbbb欧美| 欧美精品尤物在线观看| www.成人黄色| 亚洲成av人片一区二区三区| 久草在现在线| 91天堂在线视频| 亚洲影音先锋| 日本女人性生活视频| 精品美女在线播放| 欧美××××黑人××性爽| 伊人久久av导航| 成人污视频在线观看| 精品成人无码久久久久久| 久久综合久中文字幕青草| 欧美日韩直播| 中文字幕成人免费视频| 午夜一区二区三区视频| 日本电影在线观看网站| 国产精品一区二区av| 捆绑调教一区二区三区| 精品在线视频免费| 少妇激情综合网| 日韩av资源网| 一区二区三区四区毛片| 精品久久久久久久久久ntr影视| 午夜免费视频在线国产| 久久精品五月婷婷|