快速业务通道

LINQ学习笔记:LINQ to SQL实体类

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-03-13
指向表中同一行的实体对象.

查看以下示例:

   1: var dc = new DataContext (“connectionString”);
   2:  
   3: Table customers = dc.GetTable ();
   4:  
   5: Customer a = customers.OrderBy (c => c.Name).First();
   6:  
   7: Customer b =customers.OrderBy (c => c.ID).First();

假设a和b返回的都是数据库中的同一条记录,这里就会有很多很有趣的结果产生.首先,当第二条查询执行的时候,它访问了数据库并且获取了一条单笔的记录,然后取得主键并且跟DataContext实例当中的实体Cache进行了一下比较, 结果发现有一条匹配的记录已经存在, 因此查询直接反复了那条已经存在的记录,没有改变任何值.这意味着,如果在第一条查询执行之后有人改变了该记录的某个值,那么第二条查询并不会获得这个最新值.这样设计的目的是为了避免一些不可意料的边界影响以及并发管理.如果你更新了某个实体的属性,但是并没有调用SubmitChanges,这些值将不会被改写.

第二个随之而来的结果是你不能显式的使用一个所有列的子集去填充一个实体类.例如,你可以使用以下的任意一种方法去查询数据并只返回客户名:

   1: customers.Select (c => c.Name);
   2:  
   3: customers.Select (c => new { Name = c.Name } );
   4:  
   5: customers.Select (c => new YourDefinedCustomerType { Name = c.Name } );

而使用以下的做法是行不通的:

   1: customers.Select (c => new Customer {Name = c.Name } );

这是因为Customer实体仅仅是部分属性被赋值,因此如果下次你有另外一个查询要返回所有的列,你得到将会是Cache中那个只有Name属性被赋值的实体.

[在一个多层应用程序中,你不能在中间层中使用一个单一的静态DataContext实例去处理所有的请求,因为DataContext并不是线程安全的.相反的,中间层方法必须根据每一次的客户端请求去创建新的DataContext对象]

自动实体生成

你可以根据已知的数据库schema,通过SqlMeta命令行工具或者VS当中的LINQ to SQL设计器来自动生成对应的LINQ to SQL实体类. 这些工具都会生成partial的实体类, 因此你可以在另外一个分离的文件中添加额外的逻辑.

作为额外的奖励, 你还将得到一个强类型的DataContext类, 它是一个DataContext的子类型并通过属性包装了每一个Table对应的实体类. 通过这个强类型DataContext,你就不再需要调用GetTable了:

   1: var dataContext = new MyTypedDataContext (“connectionString”);
   2:  
   3: Table customers = dataContext.Customers;
   4:  
   5: Console.WriteLine (customers.Count());

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号