EF6秘籍2th:實體數據建模基礎(十二)使用條件過濾對象集合-創新互聯
問題:
在實體類型上生成一個永久性的過濾,使其能夠映射為表中記錄的子集。
解決方案:
有一張保存賬號信息的表,如下圖所示。這個表有一個DeletedOn的可空列,用于保存賬號被刪除的日期和時間。如果賬號仍然是激活的,這個列為空。我們想我們的Account集合僅僅表示激活的賬號,也就是這個賬號沒有DeletedOn值。
數據庫腳本如下:
create table [Chapter2].[Account] ( AccountID int primary key identity(1,1), DeletedOn datetime null, AccountHolderID int not null )
為了建模這張表,使其僅有激活賬號填充Account實體集合,完成下面的步驟:
1、添加一個新的EDM模型。
2、選擇來自數據庫的EF設計器。
3、選擇數據連接。
4、在數據庫對象和設置對話框中,選擇Account表,并保持默認設置。點擊“完成”。點擊“EF設計器”,選擇屬性,設置“實體容器名”為“EF6Recipes9Context”;并修改名稱空間。
5、在EF設計器中,右擊Account實體,選擇“表映射”,打開“映射細節”窗口。點擊“添加條件”,選擇DeletedOn列;在操作列,選擇“是”;在值/屬性列,選擇“Null”。這樣就產生了一個映射條件:當DeletedOn為空時。
6、在EF設計器中,選中Account實體的DeletedOn屬性,右擊,選擇“刪除”。由于我們正在條件映射中使用DeletedOn列,所以它不能被映射到實體的一個屬性。在我們的模型中DeletedOn始終為Null。
原理:
當我們想在一個實體上應用永久性過濾時,我們常常使用條件映射。條件映射也是實現TPH繼承的關鍵。可應用的條件有:
using (var context = new EF6Recipes9Context()) { context.Database.ExecuteSqlCommand(@"insert into chapter2.account(DeletedOn,AccountHolderId) values('2/10/2009',1728)"); var account = new Account { AccountHolderID = 2320 }; context.Accounts.Add(account); account = new Account { AccountHolderID = 2502 }; context.Accounts.Add(account); account = new Account { AccountHolderID = 2603 }; context.Accounts.Add(account); context.SaveChanges(); } using (var context = new EF6Recipes9Context()) { foreach (var account in context.Accounts) { Console.WriteLine("Account Id = {0}", account.AccountHolderID); } }
上面的代碼中,我們首先使用Context的Database屬性的ExecuteSqlCommand方法向數據庫中插入一條記錄。主要是因為我們需要插入一條DeletedOn列為非空值的情況。在我們的模型中沒有這樣的屬性映射的這個列。事實上,Account實體類型從不實例化一個DeletedOn為非空的實例。
上面的結果并不包含我們最先插入的DeletedOn為非空的記錄。
創新互聯www.cdcxhl.cn,專業提供香港、美國云服務器,動態BGP最優骨干路由自動選擇,持續穩定高效的網絡助力業務部署。公司持有工信部辦法的idc、isp許可證, 機房獨有T級流量清洗系統配攻擊溯源,準確進行流量調度,確保服務器高可用性。佳節活動現已開啟,新人活動云服務器買多久送多久。
本文標題:EF6秘籍2th:實體數據建模基礎(十二)使用條件過濾對象集合-創新互聯
網站網址:http://www.xueling.net.cn/article/diedhj.html