无法使用Unity和实体框架

时间:2016-03-13 19:49:11

标签: c# asp.net-mvc entity-framework unity-container dbcontext

我完全不确定导致此异常的根本问题是什么。

我正在使用ASP.NET MVC,Unity.Mvc和Entity Framework 6.我有以下代码来注册我的存储库:

    public static void RegisterTypes(IUnityContainer container)
    {
        // NOTE: To load from web.config uncomment the line below. Make sure to add a Microsoft.Practices.Unity.Configuration to the using statements.
        // container.LoadConfiguration();

        // TODO: Register your types here
        // container.RegisterType<IProductRepository, ProductRepository>();

        container.RegisterType<IGenericRepository<Customer>, GenericRepository<Customer>>();
        container.RegisterType<IGenericRepository<Product>, GenericRepository<Product>>();
        container.RegisterType<IGenericRepository<Order>, GenericRepository<Order>>();
        container.RegisterType<IGenericRepository<OrderItem>, GenericRepository<OrderItem>>();
        container.RegisterType<IGenericRepository<Supplier>, GenericRepository<Supplier>>();
    }

然后在控制器中我有:

public class IndexController : Controller
{
    public IndexController(IGenericRepository<Customer> testGenericRepository)
    {
        var result = testGenericRepository.SelectAll();
    }

    public ActionResult Index()
    {
        return View();
    }
}

存储库包含以下代码:

public class GenericRepository<T> : IGenericRepository<T>
        where T : class
    {
        private readonly DbContext _dbContext;
        private readonly IDbSet<T> _dbSet;

        public GenericRepository(DbContext dbContext)
        {
            if (dbContext == null)
            {
                throw new ArgumentNullException(nameof(dbContext));
            }

            _dbContext = dbContext;
            _dbSet = _dbContext.Set<T>();
        }

        public IEnumerable<T> SelectAll()
        {
            return _dbSet.AsEnumerable<T>();
        }
    }

我遇到的问题是,如果我在“RegisterTypes”方法中有一个断点,我可以看到容器肯定已经注册了所有存储库,但是存储库的构造函数中的断点永远不会被命中

所以我认为断点没有被击中的事实,我没有注册“System.Data.Common.DbConnection”意味着存储库使用的DbContext永远不会被设置。

我找不到有关如何使用Unity的“System.Data.Common.DbConnection”和实体框架中的DbContext的任何有用信息。

如何解决此问题?

1 个答案:

答案 0 :(得分:2)

您应该添加到RegisterTypes如何构建您的DbContext,并且可能会使用哪个生命周期。

如果你有自己的班级(比如CustomContext)继承自DbContext,请注册。假设您的默认生命周期足够:

container.RegisterType<DBContext, CustomContext>();

如果直接使用DbContext,请指示Unity应使用哪个构造函数。例如,假设您的连接字符串名为appConnectionString

container.RegisterType<DBContext>(
    new InjectionConstructor("name=appConnectionString"));