.net EntityFramework用法探索系列 1

时间:2023-04-07 22:52:59

EntityFramework用法探索系列

  • (一)DatabaseFirst
  • (二)CodeFirst
  • (三)CodeFirst流畅API
  • (四)Repository和UnitOfWork
  • (五)引入Unity
  • (六)静态Repository
  • (七)线程安全实践
  • (八)事务处理
  • AutoFac和NHibernate

通过NuGet安装Autofac.WebApi。(当然要先安装Autofac.dll)。PM > Install-Package Autofac.WebApi

在Application_Start里调用Bootstrapper.Run()。

  1. protectedvoid Application_Start()
  2. {
  3. AreaRegistration.RegisterAllAreas();
  4. RegisterGlobalFilters(GlobalFilters.Filters);
  5. RegisterRoutes(RouteTable.Routes);
  6. BundleTable.Bundles.RegisterTemplateBundles();
  7. //Call Autofac DI configurations
  8. Bootstrapper.Run();
  9. }

UnitOfWork的主要用途:

(1)管理事务 。

(2)实现数据的插入,删除和更新。

(3)防止重复更新。通过对保持对象的跟踪,防止多次提交数据库操作,提高性能。

Repository

Mediates between the domain and data mapping layers using a collection-like interface for accessing domain objects

Repository模式主要用于实现业务层和数据访问层的隔离。这样做的好处是客户端代码(此处指业务层的service代码)不依赖于具体数据存储的实现。并且Repository只需要暴露必须的数据访问给Service层。

下面我们来看利用这两个模式针对我们的需求做的一个简单的实现(使用Entity Framework中ObjectContext 来实现简单的UnitOfWork的功能)

这些类之间的关系比较简单,

  1. OrderService创建一个新的OrderEntities实例来模拟和启动UnitOfWork
  2. UnitOfWork实例要传递给2个repository (CustomerRepository和OrderRepository)
  3. OrderService的实现依赖于两个repository的公开方法.
  4. UnitOfWork模式是通过EF中的object context来实现的
  5. Repository的功能封装了EF中的object context的基本CRUD操作
  6. 整个设计利用了代理设计模式(proxy design pattern)
  7. OrderService不存在也不应该对objectConext的直接引用和调用,在上图中我们也可以看到这点(在代码中我们的确做了一个Object Context的实例化,以后会解决这个问题)