微型项目实践(8):数据访问的实现
2: /// 构造新的数据库 33: /// </summary> 34: /// <param name="connectionString">数据库连接字符 串</param> 35: /// <returns>数据库实例</returns> 36: public static Database New(string connectionString) 37: { 38: if (string.IsNullOrEmpty(connectionString)) 39: throw new ArgumentNullException ("connectionString"); 40: 41: return new Database(connectionString, getMappingSource()); 42: } 以上代码通过Database的私有构造函数和共有静态方法保证数据库使用的外部Linq映射源是静态唯一 的。其中Database构造函数继承于DataContext的构造函数,该构造函数在Linq中的定义如下: 1: // 2: // Summary: 3: // Initializes a new instance of the System.Data.Linq.DataContext class by referencing 4: // a file source and a mapping source. 5: // 6: // Parameters: 7: // fileOrServerOrConnection: 8: // This argument can be any one of the following:The name of a file where a 9: // SQL Server Express database resides.The name of a server where a database 10: // is present. In this case the provider uses the default database for a user.A 11: // complete connection string. LINQ to SQL just passes the string to the provider 12: // without modification. 13: // 14: // mapping: 15: // The System.Data.Linq.Mapping.MappingSource. 16: public DataContext(string fileOrServerOrConnection, MappingSource mapping); Linq的映射文件使用嵌入式资源的方式储存(将其文件属性改为Embedded Resource,如下图)。而 getMappingSource方法通过加锁的方式使_MappingSource只初始化一次,其中两次使用了if (_MappingSource == null),确保取得锁的过程中的不会出现并发冲突(尽管这种概率极小)。 Database的第二部分是实现IDatabase接口,涉及代码如下: 1: #region IDatabase Members 2: 3: /// <summary> 4: /// 取得某一个实体的数据访问 5: /// </summary> 6: /// <typeparam name="T">实体类型</typeparam> 7: /// <returns>该实体的数据访问</returns> 8: public IEntityDataAccess<T> GetDataAccess<T>() where T : class 9: { 10: return new EntityDataAccessAdapter<T>(this); 11: } 12: 13: /// <summary> 14: /// 提交数据库变更 15: /// </summary> 16: public void Submit() 17: { 18: base.SubmitChanges(); 19: } 20: 21: #endregion 22: 23: #region Blogs 24: 25: public IEntityDataAccess<Blog> Blogs 26: { 27: get { return new EntityDataAccessAdapter<Blog>(this); } 28: } 29: 30: public IEntityDataAccess<BlogClass> BlogClasses 31: { 32: get { return new EntityDataAccessAdapter<BlogClass>(this); } 33: } 34: 35: #endregion 可以从代码中看到,对于GetDataAccess<T>的调用,全部委托给了EntityDataAccessAdapter类 。至于EntityDataAccessAdapter类,全部是调用System.Data.Linq.Table的方法,看一下代码很容易就 可以明白,就不贴出来了。 最后一个问题:Linq的 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |