我在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
}
}
答案 0 :(得分:1)
IObjectContextAdapter
是ObjectContext
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
}