EF6 秘籍 2th:实体数据建模基础 (十二)使用条件过滤对象集合
问题:
在实体类型上生成一个永久性的过滤,使其能够映射为表中记录的子集。
解决方案:
有一张保存账号信息的表,如下图所示。这个表有一个DeletedOn的可空列,用于保存账号被删除的日期和时间。如果账号仍然是激活的,这个列为空。我们想我们的Account集合仅仅表示激活的账号,也就是这个账号没有DeletedOn值。
数据库脚本如下:
createtable[Chapter2].[Account](AccountIDintprimarykeyidentity(1,1),DeletedOndatetimenull,AccountHolderIDintnotnull)
为了建模这张表,使其仅有激活账号填充Account实体集合,完成下面的步骤:
1、添加一个新的EDM模型。
2、选择来自数据库的EF设计器。
3、选择数据连接。
4、在数据库对象和设置对话框中,选择Account表,并保持默认设置。点击“完成”。点击“EF设计器”,选择属性,设置“实体容器名”为“EF6Recipes9Context”;并修改名称空间。
5、在EF设计器中,右击Account实体,选择“表映射”,打开“映射细节”窗口。点击“添加条件”,选择DeletedOn列;在操作列,选择“是”;在值/属性列,选择“Null”。这样就产生了一个映射条件:当DeletedOn为空时。
6、在EF设计器中,选中Account实体的DeletedOn属性,右击,选择“删除”。由于我们正在条件映射中使用DeletedOn列,所以它不能被映射到实体的一个属性。在我们的模型中DeletedOn始终为Null。
原理:
当我们想在一个实体上应用永久性过滤时,我们常常使用条件映射。条件映射也是实现TPH继承的关键。可应用的条件有:
<value> Is Null
<value> Is Not Null
<integer> = <value>
<string> = <value>
using(varcontext=newEF6Recipes9Context()){context.Database.ExecuteSqlCommand(@"insertintochapter2.account(DeletedOn,AccountHolderId)values('2/10/2009',1728)");varaccount=newAccount{AccountHolderID=2320};context.Accounts.Add(account);account=newAccount{AccountHolderID=2502};context.Accounts.Add(account);account=newAccount{AccountHolderID=2603};context.Accounts.Add(account);context.SaveChanges();}using(varcontext=newEF6Recipes9Context()){foreach(varaccountincontext.Accounts){Console.WriteLine("AccountId={0}",account.AccountHolderID);}}
上面的代码中,我们首先使用Context的Database属性的ExecuteSqlCommand方法向数据库中插入一条记录。主要是因为我们需要插入一条DeletedOn列为非空值的情况。在我们的模型中没有这样的属性映射的这个列。事实上,Account实体类型从不实例化一个DeletedOn为非空的实例。
上面的结果并不包含我们最先插入的DeletedOn为非空的记录。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。