精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

最新国产露脸在线观看| 国产夫妻性生活视频| 精品久久网站| 日韩一区二区三区在线| 日韩精品―中文字幕| 高清中文字幕一区二区三区| 国产在线看一区| 欧美一级淫片播放口| 久久一级免费视频| 欧美精品密入口播放| 69堂国产成人免费视频| 久久久久久久久久久福利| 好吊日视频在线观看| 2022国产精品视频| 96成人在线视频| 国产精品视频123| 国产精品porn| 亚洲欧洲国产伦综合| 成年人看片网站| 久久av影院| 一本到一区二区三区| av网站手机在线观看| 美女隐私在线观看| 久久人人97超碰com| 91九色露脸| 在线视频 中文字幕| 亚洲免费综合| 97欧美精品一区二区三区| 91视频综合网| 香蕉久久网站| 色婷婷久久一区二区| 性猛交ⅹxxx富婆video | 欧洲日本在线| 久久日韩精品一区二区五区| 国产亚洲精品久久飘花| 国产99999| 精品在线视频一区| 国产精品欧美日韩一区二区| 综合网在线观看| 精品96久久久久久中文字幕无| 久久久黄色av| 午夜精品一区二区三区视频| 久久久9色精品国产一区二区三区| 国产亚洲欧洲高清一区| 制服 丝袜 综合 日韩 欧美| 亚洲精华一区二区三区| 亚洲精品在线观看www| 熟女丰满老熟女熟妇| 欧美日韩一本| 日韩国产欧美精品在线| xxxx黄色片| 日韩三区视频| 亚洲欧美一区二区三区情侣bbw| 国产精品探花一区二区在线观看| 欧美有码在线| 亚洲欧美自拍一区| 婷婷综合在线视频| 91综合视频| 久久成人免费视频| 久久久久成人网站| 日韩视频二区| 国产成人精品日本亚洲| 自拍偷拍第八页| 精品一区二区三区不卡| 亚洲一区二区三区xxx视频| av中文字幕播放| 成人动漫一区二区在线| 久久青青草综合| a中文在线播放| 中文字幕色av一区二区三区| 九九久久九九久久| 国产乱码精品一区二三赶尸艳谈| 日韩欧美高清在线视频| 男女视频在线看| 日韩成人在线电影| 精品久久久久久无| 麻豆精品免费视频| 999久久久免费精品国产| 欧美夫妻性生活xx| 国产高清中文字幕| 国产一区二区电影| 精品婷婷色一区二区三区蜜桃| 成人亚洲综合天堂| 亚洲精选视频在线| 欧美日韩第二页| 亚洲成a人片777777久久| 亚洲精品一区二区三区99| 亚洲一区二区三区蜜桃| 91精品国产91久久久久久黑人| 777777777亚洲妇女| 91丨九色丨海角社区| 国产电影精品久久禁18| 日韩av图片| 免费在线播放电影| 欧美日韩中文精品| 成人做爰www看视频软件| av影片在线一区| 久久久久久69| 中文字幕乱码在线观看| 不卡一区在线观看| 一区二区三区av| 最新日韩精品| 欧美tk—视频vk| 羞羞在线观看视频| 亚洲欧美清纯在线制服| 91av一区二区三区| 最新国产在线观看| 日韩欧美中文字幕在线播放| 亚洲一级片免费观看| 国产欧美日韩视频在线| 久久久久久久久久国产| 亚洲一级视频在线观看| www国产成人| 大西瓜av在线| 精品国产亚洲一区二区三区在线 | 日本japanese极品少妇| 在线国产一区| 国产狼人综合免费视频| 青青草娱乐在线| 午夜伦理一区二区| 亚洲精品久久久久久| 成人短片线上看| 日本精品久久电影| 天天干天天舔天天射| 一区二区三区在线视频免费观看| 日本一二区免费| 国产一区不卡| 欧洲亚洲妇女av| 天天操天天操天天操| 亚洲伊人伊色伊影伊综合网| 中文字幕亚洲影院| 久久视频国产| 国产日韩在线观看av| 国产精品天堂| 在线观看国产91| 3d动漫精品啪啪一区二区下载| 日韩午夜av| 国语精品中文字幕| www.九色在线| 亚洲国产精品嫩草影院久久| 国产精品成人久久| 成人午夜电影久久影院| 久无码久无码av无码| xvideos.蜜桃一区二区| 97国产精品视频| 图片区 小说区 区 亚洲五月| 午夜精品久久久久久久99水蜜桃| 国产精品入口麻豆| 国产农村妇女毛片精品久久莱园子| 久久久www免费人成黑人精品| 一区一区三区| 亚洲欧美在线一区二区| 中文区中文字幕免费看| 中文无字幕一区二区三区| 色噜噜狠狠一区二区| 亚洲成人精选| 成人国产1314www色视频| 欧美v亚洲v| 亚洲国产精品高清久久久| 国产区一区二区三| 国产精品午夜春色av| 中文字幕在线观看日| 欧美有码视频| 精品无人区一区二区三区| 欧美一区久久久| 精品久久久91| 手机看片福利永久| 在线精品视频免费观看| 久久av红桃一区二区禁漫| 国产成人综合在线观看| 欧美日本一区二区三区| 91久久精品一区二区别| 欧美另类tv| 亚洲理论在线a中文字幕| 懂色av蜜臀av粉嫩av喷吹| 日韩美女久久久| 国产香蕉精品视频| 久久中文精品| 51xx午夜影福利| 欧美偷窥清纯综合图区| 国产精品美女免费看| 国产一二区在线观看| 亚洲精品videossex少妇| 午夜一区二区三区四区| 亚洲精品国产a| 国产又爽又黄无码无遮挡在线观看| 奇米777欧美一区二区| 国产91在线亚洲| 国产亚洲电影| 懂色av一区二区三区在线播放| 一区一区三区| 欧美国产日韩中文字幕在线| 美女毛片在线看| 日韩一区二区免费在线电影| 99精品视频99| 亚洲三级免费观看| 手机免费看av| 成人av免费在线| 涩多多在线观看| 肉色丝袜一区二区| 亚洲熟妇无码另类久久久| 五月激情综合| 日本一区二区三区免费看| 高清日韩欧美| 3d动漫精品啪啪一区二区三区免费 | 亚洲男同1069视频| 一级特黄曰皮片视频| av日韩在线网站| 日韩久久久久久久久久久| 视频在线观看国产精品| 欧美在线观看视频免费| 91青青国产在线观看精品| 欧美1o一11sex性hdhd| 91精品国产乱码久久久竹菊| 国产欧美精品一区二区三区-老狼| 激情国产在线| 欧美精品xxx| а天堂中文在线官网| 中文字幕自拍vr一区二区三区| 四虎影视在线观看2413| 精品动漫一区二区三区在线观看| 国产麻豆免费观看| 欧美日韩三级一区二区| 无码人妻aⅴ一区二区三区有奶水| 亚洲一区二区三区四区在线观看| 亚洲欧美另类日本| 国产精品美女视频| 国产伦精品一区二区三区视频女| 久久影院视频免费| 欧美 日本 国产| 91蜜桃免费观看视频| 久久性爱视频网站| 成人av电影在线播放| 在线观看免费视频国产| 顶级嫩模精品视频在线看| www.欧美com| 国产成人精品一区二区三区网站观看| 国产传媒免费观看| 国产精品1区2区3区在线观看| 亚洲制服中文字幕| 国产美女久久久久| 又黄又爽又色的视频| 国产成人精品一区二区三区网站观看| 中文字幕乱码在线人视频| 国产精品自产自拍| 国产污在线观看| 不卡一区中文字幕| 波多野结衣 在线| 国产日韩欧美不卡| 日本裸体美女视频| 亚洲天堂久久久久久久| 欧美成欧美va| 亚洲成av人片观看| 中文字幕av影院| 欧美三级电影在线观看| 国产乱码精品一区二三区蜜臂| 欧美一区二区三区免费大片| www.午夜激情| 日韩av影院在线观看| 国产在线一二三区| 精品国内亚洲在观看18黄| 亚洲羞羞网站| 68精品国产免费久久久久久婷婷| xxxxxx欧美| 91色精品视频在线| 国产精品毛片久久久| 欧美一区二区三区在线播放| 久久亚洲专区| 青草视频在线观看视频| 久久精品电影| 欧美xxxxxbbbbb| 99这里都是精品| 亚洲午夜久久久久久久国产| 亚洲三级小视频| 久久黄色精品视频| 欧美狂野另类xxxxoooo| 亚洲国产精品suv| 亚洲视频精品在线| av免费网站在线| 人体精品一二三区| 国产精品一区二区精品视频观看| 国产一区二区无遮挡| 成人av二区| 免费观看美女裸体网站| 欧美aaaaaa午夜精品| www.四虎在线| 欧美国产精品一区二区| 麻豆91精品91久久久| 日本黄色一区二区| 亚洲国产中文字幕在线| 亚洲色图第一页| 日本无删减在线| 国产精品三级久久久久久电影| 中文字幕视频精品一区二区三区| 欧美日韩一区二区视频在线观看| 亚洲欧美偷拍自拍| 激情六月丁香婷婷| 成人午夜精品在线| 国产精品国产三级国产传播| 一本大道av伊人久久综合| 亚洲AV无码国产精品午夜字幕 | 国产免费无码一区二区视频| 色婷婷av一区二区三区gif| 精品人妻一区二区三区日产乱码| 国产亚洲视频在线| 国产精选在线| 成人区精品一区二区| 四虎成人av| 成年人网站大全| 99久久国产综合色|国产精品| 日本黄色片免费观看| 欧美在线小视频| 暖暖视频在线免费观看| 久久久免费观看视频| 欧美视频二区欧美影视| 一本一道久久a久久综合精品| 久久久xxx| 极品白嫩丰满美女无套| 亚洲成国产人片在线观看| 国产毛片在线视频| 色999日韩欧美国产| 日韩av超清在线观看| 美脚丝袜一区二区三区在线观看| 好看的av在线不卡观看| 亚洲热在线视频| 亚洲猫色日本管| 国产精品久久欧美久久一区| 丝袜一区二区三区| 成人在线视频免费| 亚洲精蜜桃久在线| 视频在线观看一区二区三区| 人人人妻人人澡人人爽欧美一区| 狠狠综合久久av一区二区小说| 污污网站在线免费观看| 97精品久久久| 女仆av观看一区| av动漫在线看| 91久色porny| 日韩一级在线视频| 亚洲女人天堂网| 国产v综合v| 亚洲欧美日韩另类精品一区二区三区| 美日韩一级片在线观看| 羞羞在线观看视频| 日韩一级片在线播放| 亚洲淫性视频| 国产伦精品一区二区三| 欧美视频久久| 国产精品久久AV无码| 天天影视网天天综合色在线播放| 亚洲av毛片成人精品| 日本一区二区在线免费播放| 精品久久久久久久久久久下田| 黄色手机在线视频| 亚洲欧美综合在线精品| 亚洲春色一区二区三区| 久久久伊人日本| 欧洲专线二区三区| 色天使在线观看| 亚洲一区二区三区四区在线观看 | 中文字幕精品—区二区| 日韩三级成人| 97久久国产亚洲精品超碰热| 成人av网址在线观看| 成人免费毛片视频| 久久人体大胆视频| 97色成人综合网站| 国产av无码专区亚洲精品| 中文字幕制服丝袜成人av| www日本高清| 日本sm极度另类视频| 97欧美在线视频| 亚洲久久久久久| 欧美日韩一区二区三区免费看| 日本孕妇大胆孕交无码| 欧美午夜精品久久久久免费视| 久久国产精品免费| 国产第100页| 一区二区三区视频免费| 日韩欧美中文字幕一区二区三区| 日本午夜激情视频| 中文一区二区完整视频在线观看| 精品国产乱码一区二区三| 4438全国成人免费| 综合激情视频| 中文字幕av网址| 精品国精品国产| 色猫猫成人app| 激情五月宗合网| 亚洲欧洲99久久| 久热av在线| 国产福利不卡| 久久国产夜色精品鲁鲁99| 圆产精品久久久久久久久久久| 日韩亚洲第一页| 欧美猛男男男激情videos| 免费在线观看日韩av| 欧美在线短视频| 麻豆视频在线看| 青青草免费在线视频观看|