集成 Entity Framework

ABP 基础设施层——集成 Entity Framework

本文翻译自ABP的官方教程《EntityFramework Integration》,地址为:http://aspnetboilerplate.com/Pages/Documents/EntityFramework-Integration

ABP 可以与任何 ORM 框架协同工作,它内置了对 EntityFramework 的集成支持。本文将介绍如何在 ABP 中使用 EntityFramework。本文假定你已经初步掌握了EntityFramework。

译者注:怎么才算初步掌握了 EntityFramework 呢?译者认为应当懂得使用 Code First 模式进行CRUD。

1 Nuget 包

要在 ABP 中使用 EntityFramework 作为 ORM 框架的话,需要到 Nuget 上下载一个名为 Abp.EntityFramework的包。比较好的做法是:新建一个独立的程序集 (dll),然后在这个程序集中调用这个包和 EntityFramework。

2 创建 DbContext(Creating DbContext)

要使用 EntityFramework,首先需要定义一个 DbContext 类。下面是一个DbContex 类的示例:

public class SimpleTaskSystemDbContext : AbpDbContext
{         public virtual IDbSet<Person> People { get; set; }  

    public virtual IDbSet<Task> Tasks { get; set; }
    public SimpleTaskSystemDbContext()
        :   base("MyConnectionStringName")
   {

   }      

   protected override void OnModelCreating(DbModelBuilder modelBuilder)
   {                 base.OnModelCreating(modelBuilder);
         modelBuilder.Entity<Person>().ToTable("StsPeople");
         modelBuilder.Entity<Task>().ToTable("StsTasks").HasOptional(t=> t.AssignedPerson);
    }

} 

上面的 SimpleTaskSystemDbContext 本质上是一个 DbContext 类,它派生自 AbpDbContext,而不是 DbContext。AbpDbContext 提供了很多重载的构造函数,如果需要的话,我们可以使用它。EntityFramework 可以使用约定的方式来映射实体和数据表。除非你想进行自定义映射,否则你甚至不需要做任何配置。在上例中,我们将实体映射到了不同的表中。默认情况下(按照约定优先于配置的原则,会默认采用约定的方式),Task 实体会映射到 Tasks 表,但在这里我们将它映射到了 StsTasks 表。相比起使用 Data Annotation 模式来进行自定义映射,我更喜欢使用 Fluent API 模式。当然,你可以选择你所喜欢的模式,这里没有特别的限制。

3 仓储(Repositories)

ABP 提供了一个名为 EfRepositoryBase 的基类,这使得实现仓储变得简单快捷。要实现 IRepository 接口,你只需要从这个基类进行派生即可。但是更好的做法是,自定义一个派生自 EfRepositoryBase 的基类,然后在这个基类中添加一些通用的方法。这样做的好处是,所有派生自这个基类的仓储都继承了这些通用方法。

(1)应用程序专用的仓储基类(Application specific base repository class)

在下面的例子中,我们定义了一个名为 SimpleTaskSystem 仓储基类,这个类是此应用程序所专用的。

// 应用程序中的所有仓储的基类
public class SimpleTaskSystemRepositoryBase<TEntity, TPrimaryKey> :  EfRepositoryBase<SimpleTaskSystemDbContext, TEntity, TPrimaryKey>
    where TEntity : class, IEntity<TPrimaryKey>
{
  public SimpleTaskSystemRepositoryBase(IDbContextProvider<SimpleTaskSyst  emDbContext> dbContextProvider)
        : base(dbContextProvider)
    {

    }

  //添加仓储基类的通用方法

}

public class   SimpleTaskSystemRepositoryBase<TEntity> :   SimpleTaskSystemRepositoryBase<TEntity, int>         where TEntity : class,   IEntity<int>
{
   public SimpleTaskSystemRepositoryBase(IDbContextProvider<SimpleTaskSyst   emDbContext> dbContextProvider)
        : base(dbContextProvider)
    {

    }  

  // 不 要 在 这 里 添 加 任 何 通 用 方 法 ,通 用 方 法 应 当 被添加到 上 面 的 基 类 中(MyRepositoryBase<TEntity, TPrimaryKey>)

}

需 要 注 意 的 是 , 我 们 继 承 了 基 类EfRepositoryBase<SimpleTaskSystemDbContext, TEntity, TPrimaryKey>。这相当于做了一个声明,它会让 ABP 在仓储中调用 SimpleTaskSystemDbContext。

(2)仓储实现(Implementing a repository)

如果你只想使用预定义的仓储方法的话,你甚至不需要为实体创建仓储类。如下所示:

public class PersonAppService : IPersonAppService
{
    private readonly IRepository<Person> _personRepository;

     public   PersonAppService(IRepository<Person> personRepository)
     {
           _personRepository = personRepository;
     }     

     public void   CreatePerson(CreatePersonInput input)
      {
          person = new   Person { Name = input.Name, EmailAddress = input.EmailAddress };
         _personRepository.Insert(person);
    }
}  

PersonAppService类采用构造函数注入的方式注入了一个IRepository<Person>对象,然后调用了预定义的 Insert 方法。采用这种方式,你可以方便地注入IRepository<TEntity> (或者 IRepository<TEntity, TPrimaryKey>)对象,然后使用预定义的方法。查看仓储文档以获得预定义方法的列表。

(3)自定义仓储(Custom repositories)

要实现自定义仓储,只要从上面所创建的应用程序专用的仓储基类(SimpleTaskSystemRepositoryBase)派生即可。

假定我们有一个名为 Task 的实体,它可以被赋予 Person 实体。Task 有一个状态属性(值为新建、已分配、已完成等)。我们需要编写一个自定义方法,这个方法能根据某些条件获取 Task 列表,并且使得 Task 的 AssisgnedPerson 属性可以在一次数据库查询中被加载(使用 EntityFramework 的贪婪加载方法 Include)。如下所示:

public interface ITaskRepository : IRepository<Task,   long> {
    List<Task> GetAllWithPeople(int? assignedPersonId, TaskState?   state);
}  

public class  TaskRepository : SimpleTaskSystemRepositoryBase<Task, long>,   ITaskRepository
{
     public TaskRepository(IDbContextProvider<SimpleTaskSystemDbContext>  dbContextProvider)
        : base(dbContextProvider)
     {
     }     

   public List<Task>   GetAllWithPeople(int? assignedPersonId, TaskState? state)
    {
        var query = GetAll();
        if (assignedPersonId.HasValue)
        {
            query = query.Where(task =>   task.AssignedPerson.Id == assignedPersonId.Value);
        }
        if (state.HasValue)
        {
             query = query.Where(task =>   task.State == state);
        }
         return query
            .OrderByDescending(task =>   task.CreationTime)
            .Include(task =>   task.AssignedPerson)
            .ToList();
    }
}
                                             

我们首先定义了一个名为 ITaskRepository 的接口,紧接着定义了一个名为 TaskRepository 的类来实现它。预定义方法 GetAll()返回了一个 IQueryable<Task> 对象,接着我们将参数放入到 Where 筛选器中,最后调用 ToList()来获得一个 Task 列表。此外,我们可以通过调用 base.Context 属性来获得一个 DbContext 对象,这样一来,你就可以直接使用 Entity Framework 的所有功能。

仓储类应当在构造函数中获取IDbContextProvider对象。通过这种方式,在单元测试的时候,我们可以很容易地注入一个虚拟的 DbContext Provider 对象;而在运行的时候,ABP 会根据配置注入相应的 DbContext Provider 对象。

分类: 架构

标签: Abpentity framework

时间: 2024-10-11 18:18:51

集成 Entity Framework的相关文章

Entity Framework Code First 常用方法集成

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86

Entity Framework 学习

Entity Framework 学习初级篇1--EF基本概况... 2 Entity Framework 学习初级篇2--ObjectContext.ObjectQuery.ObjectStateEntry.ObjectStateManager类的介绍... 7 Entity Framework 学习初级篇3-- LINQ TOEntities. 10 Entity Framework 学习初级篇4--EntitySQL. 17 Entity Framework 学习初级篇5--ObjectQ

采用MiniProfiler监控EF与.NET MVC项目(Entity Framework 延伸系列1)

小分享:我有几张阿里云优惠券,用券购买或者升级阿里云相应产品最多可以优惠五折!领券地址:https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=ohmepe03 前言 Entity Framework 延伸系列目录 今天来说说EF与MVC项目的性能检测和监控 首先,先介绍一下今天我们使用的工具吧. MiniProfiler~ 这个东西的介绍如下: MVC MiniProfiler是Stack Overf

[Programming Entity Framework] 第3章 查询实体数据模型(EDM)(一)

http://www.cnblogs.com/sansi/archive/2012/10/18/2729337.html Programming Entity Framework 第二版翻译索引 你可以使用各种方法查询实体数据模型.你选择有些方法是因为个人喜好,而其它的则是因为你可以利用特殊的效益.你很有可能已经听过LINQ to Entities和Entity SQL.你可以使用特殊的方法去查询,比如某些基于LINQ,而其它的基于EF的ObjectQuery类.这此查询方法中的每一个都会产生具

[原创]Entity Framework查询原理

前言 Entity Framework的全称是ADO.NET Entity Framework,是微软开发的基于ADO.NET的ORM(Object/Relational Mapping)框架.Entity Framework的主要特点:1. 支持多种数据库(Microsoft SQL Server, Oracle, and DB2):2. 强劲的映射引擎,能很好地支持存储过程:3. 提供Visual Studio集成工具,进行可视化操作:4. 能够与ASP.NET, WPF, WCF, WCF

Entity Framework 1

-----------------------19:15 2015/1/31 EF----------------------------------- EF5.0利用Entity Framework,开发人员可以使用.NET对象和语言集成查询(LINQ)对关系数据库进行编程.它具有多项新功能,包括持久性忽略和POCO支持 ,外键关联,延迟加载,测试驱动开发支持,模型中的函数和新的LINQ运算符.其他功能包括:带自跟踪实体的更好的N层支持.使用T4模板的可自定义 的代码生成,模型首次开发,改进的

entity framework 新手入门篇(1)-建立模型

entity framework是微软官方免费提供给大家的一套ORM(Object Relational Mapping对象关系映射)解决方案.它不仅可以帮助我们解决数据缓存的问题,还能在最小的开销下实现完全的OO(Object Oriented面向对象)编程.实乃中小项目中敏捷开发的一大福祉.博主作为一只刚入本行的菜鸟,有幸参加开发了几个使用entity framework(以下简称EF)的项目,虽然在这些项目开发的过程中,走了许多的弯路,网上的资料也不甚齐全.在摸爬滚打了一年之后,也算有了一

【译著】Code First :使用Entity. Framework编程(6)

小分享:我有几张阿里云优惠券,用券购买或者升级阿里云相应产品最多可以优惠五折!领券地址:https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=ohmepe03 Chapter6 Controlling Database Location,Creation Process, and Seed Data 第6章 控制数据库位置,创建过程和种子数据 In previous chapters you have

【译著】Code First :使用Entity. Framework编程(1)

参考页面: http://www.yuanjiaocheng.net/entity/Persistence-in-EF.html http://www.yuanjiaocheng.net/entity/crud-in-connected.html http://www.yuanjiaocheng.net/entity/crud-in-Disconnected.html http://www.yuanjiaocheng.net/entity/add-entity-in-disconnected.h