带有EF上下文的ASP.NET Unity.MVC DI

时间:2016-08-11 13:33:19

标签: asp.net entity-framework unity-container

我在ASP.NET MVC 4.6应用程序中使用Unity.MVC for DI。我有一个服务接口传递到控制器,这是很好的工作。现在我想将一个接口传递给服务的EF上下文,但我不知道该怎么做。我已经读过EF有这个IObjectContextAdapter我可以传递到我的服务ctor并且工作,但我需要从这个上下文查询我的服务内部的实际表,但因为它是一个IObjectContextAdapter它不知道我的表。我该怎么做?

 public class ContactService : IContactService
    {
        //private ContactsEntities context;
        private IObjectContextAdapter context;

        // test ctor
        public ContactService(IObjectContextAdapter ctx)
        {
            context = ctx;
        }

        // prod ctor
        public ContactService()
        {
            context = new ContactsEntities();
        }

        List<Contact> GetAllContacts()
        {
            return (from c in context.ObjectContext.?? // I need to query the Contacts table that would be attached to the actual context I pass in but still keep the decoupling from using an Interface passed into the ctor

        }
    }

1 个答案:

答案 0 :(得分:1)

IObjectContextAdapterObjectContext DbContext属性的类型。

您应该将DbContext作为子类,例如ContactsDatabaseContext

public class ContactsDatabaseContext : DbContext, IContactsDatabaseContext
{
  // ...
}

然后只需在您的IoC容器中注册ContactsDatabaseContext即可。像这样:

container.RegisterType<IContactsDatabaseContext, ContactsDatabaseContext>();

您的ContactsDatabaseContext类和IContactsDatabaseContext界面应具有引用您的表格的DbSet<T>类型的属性,例如:

IDbSet<BrandDb> Users { get; set; }

更新:

由于您使用的是生成的文件,请执行以下操作:

public partial class ContactsDatabaseContext : IContactsDatabaseContext
{
  // Expose the DbSets you want to use in your services
}