在MVC 4中创建通用数据库上下文

时间:2013-11-11 21:53:44

标签: entity-framework asp.net-mvc-4 data-binding

我写了一个MVC 4应用程序。我有一些问题:

public class DatabaseContext<TEntity>: DbContext where TEntity: class
{
    ...
    public DbSet<TEntity> entity = {get; set;}
    ...
}
  1. 我想创建一个像DatabaseContext这样的通用数据库上下文,并将其用于数据库表中定义的所有实体。 请写一个例子。
  2. 我现在不知道如何在global.asax中初始化泛型上下文并且每次都使用它,无论在项目的哪个部分都是必需的。 请写一些例子。

2 个答案:

答案 0 :(得分:1)

在我看来,您正在实施的是Repository Pattern

public interface IRepository<TEntity> where TEntity : class
{
    IEnumerable<TEntity> GetAll();

    TEntity GetById(Guid id);
}

防止让您的存储库继承自DbContext,因为DbContextUnit of Work pattern的实现,而工作单元不是存储库(而是包含或管理多个存储库)。

您可以做的是让您的存储库在内部使用DbContext

public class Repository<TEntity> : IRepository<TEntity>
{
    private readonly DbContext context;

    public Repository(DbContext context)
    {
        this.context = context;
    }

    public IEnumerable<TEntity> GetAll()
    {
        return this.context.Set<TEntity>();
    }

    public TEntity GetById(Guid id)
    {
        var entity = this.context.Set<Entity>().Find(id);

        if (entity == null) throw new KeyNotFoundException(
            typeof(TEntity).Name + " with id " + id + " not found);

        return entity;
    }
}

<强>更新

由于我是依赖注入爱好者,我认为依赖注入是您问题的解决方案。由于我是the Simple Injector project的开发人员,我将向您展示如何使用Simple Injector执行此操作:

第1步:Simple Injector MVC Integration Quick Start NuGet包安装到您的MVC项目中(我假设您知道如何安装NuGet包)。

第2步:编译项目。您将在包刚刚添加的SimpleInjectorInitializer类中收到编译器错误。这是您必须进行注册的行。你可以删除这条#error行。

第3步:SimpleInjector.Extensions命名空间添加到SimpleInjectorInitializer文件的顶部:

using SimpleInjector.Extensions;

第4步:InitializeContainer方法中进行以下注册:

container.RegisterOpenGeneric(typeof(IRepository<>), typeof(Repository<>));

container.RegisterPerWebRequest<DbContext>(
    () => new DbContext("Your connection string here"));

第5步:IRepository<T>依赖项添加到控制器:

public class CustomerController : Controller
{
    private readonly IRepository<Customer> customerRepository;

    public CustomerController(IRepository<Customer> customerRepository)
    {
        this.customerRepository = customerRepository;
    }

    // controller methods here.
}

现在您的存储库将自动注入您的控制器。

答案 1 :(得分:0)

您是否有理由使用泛型类型参数创建DatabaseContext?您不会在一个地方实例化它,因为每个不同的DatabaseContext都是一个单独的.NET类型。

除非您严格遵守特定模式,否则我个人认为这种方法在具有多个集合的单个DatabaseContext中没有任何实际优势:

public class DatabaseContext: DbContext
{
    public DbSet<SomeEntity> SomeEntities { get; set; }
    public DbSet<OtherEntity> OtherEntities { get; set; }
}

...
myDatabaseContext.SomeEntities.GetAll();
myDatabaseContext.OtherEntities.GetAll();

// OR:
myDatabaseContext.Set<SomeEntity>().GetAll();
myDatabaseContext.Set<OtherEntity>().GetAll();