数据访问层及EntityFramework
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了数据访问层及EntityFramework,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2460字,纯文字阅读大概需要4分钟。
内容图文
![数据访问层及EntityFramework](/upload/InfoBanner/zyjiaocheng/1283/3bad9819a48348d28bcc0100ab3ba318.jpg)
数据访问层(Data Access Layer)负责与数据储存设备打交道,为业务层提供数据服务(一般指增、删、改、查)。一个好的数据访问层可在不影响其他逻辑的情况下,替换数据访问技术、数据据库。
数据访问层的常见模式与原则
- 工作单元(Unit of Work)
维护一系列操作的事务性(Transaction),一系列操作要么都成功,如果有一个操作失败,则事务回滚。这里也主要用于对数据库的操作。
如果通过sql
脚本直接访问数据库,可以直接用sql
调用相应数据库的事务。
如果采用自己写的ORM,则可定义一个IUnitOfWork
接口,将增、删、改的数据保存进集合,在Commit
方法将object数据存储数据库,可通过TransactionScope
实现事务使用方式连接。
public interface IUnitOfWork
{
void RegisterAmended(IAggregateRoot entity, IUnitOfWorkRepository unitofWorkRepository);
void RegisterNew(IAggregateRoot entity, IUnitOfWorkRepository unitofWorkRepository);
void RegisterRemoved(IAggregateRoot entity, IUnitOfWorkRepository unitofWorkRepository);
void Commit();
}
如果利用第三方ORM库,一般都提供Unit of work
- 标识映射
标识映射即通过唯一标识,将加载的数据存入缓存,方便下次访问。 - 延迟加载 表示需要时才去加载所需的资源。一般指需要时采取加载外键关联的表。如在学生管理系统,每个学生都有自己的成绩,在展示学生列表时不加载成绩,只有进入某个学生详细信息才加载。
-
数据并发控制
同时修改一份数据造成修改冲突,一般通过为数据添加一个version
属性表明版本。EntityFramework
EntityFramework是微软官方提供的ORM类库,其采用
Repository
模型,功能强大,这里简单介绍下其数据访问层特性的实现。工作单元(Unit of Work)
- 隐式事务
using (var context = new MyStoreContext())
{
customer = new Customer { FirstName = request.FirstName, LastName = request.LastName };
context.Customers.Add(customer);
context.SaveChanges();
return customer;
}
其中context.SaveChanges()
方法事务执行,其内部实现了事务。
- 显示事务
using (var context = new BloggingContext())
{
using (var transaction = context.Database.BeginTransaction())
{
try
{
context.Blogs.Add(new Blog { Url = "http://blogs.msdn.com/dotnet" });
context.SaveChanges();
context.Blogs.Add(new Blog { Url = "http://blogs.msdn.com/visualstudio" });
context.SaveChanges();
var blogs = context.Blogs
.OrderBy(b => b.Url)
.ToList();
transaction.Commit();
}
catch (Exception)
{
// TODO: Handle failure
}
}
}
- Cross-context transaction(跨库的事务)
using (var context1 = new BloggingContext(connectionstring1))))
{
using (var transaction = context1.Database.BeginTransaction())
{
try
{
context1.Blogs.Add(new Blog { Url = "http://blogs.msdn.com/dotnet" });
context1.SaveChanges();
using (var context2 = new BloggingContext(connectionstring2))
{
//context2 用context1的事务
context2.Database.UseTransaction(transaction.GetDbTransaction());
var blogs = context2.Blogs
.OrderBy(b => b.Url)
.ToList();
}
transaction.Commit();
}
catch (Exception)
{
// TODO: Handle failure
}
延迟性加载
EntityFramework 默认为延迟加载,如果希望饥渴加载需要include
数据并发控制
为实体添加version
属性
[Timestamp]
public byte[] RowVersion { get; set; }
通过异常机制查询保存的数据是否被修改或删除,异常为DbUpdateConcurrencyException
原文:https://www.cnblogs.com/LoveTomato/p/9408868.html
内容总结
以上是互联网集市为您收集整理的数据访问层及EntityFramework全部内容,希望文章能够帮你解决数据访问层及EntityFramework所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。