2016-02-16 3 views
0

Я прочитал этот пост DbContext has been disposed and autofac, но я все еще получаю ту же ошибку:Autofac DbContext были захоронены

The operation cannot be completed because the DbContext has been disposed.

public class EFRepository : IRepository 
{ 
    private EFDbContext context; 

    public EFRepository(EFDbContext ctx) 
    { 
     context = ctx; 
    } 

    public TEntity FirstOrDefault<TEntity>(Expression<Func<TEntity, bool>> predicate, params Expression<Func<TEntity, object>>[] includes) 
     where TEntity : class, IContextEntity 
    { 
     IQueryable<TEntity> query = includes.Aggregate<Expression<Func<TEntity, object>>, IQueryable<TEntity>> 
        (context.Set<TEntity>(), (current, expression) => current.Include(expression));    

     return query.FirstOrDefault(predicate); 
    } 
} 

И в контроллер впрыска Global.asax

ContainerBuilder builder = new ContainerBuilder(); 
builder.RegisterControllers(typeof(MvcApplication).Assembly); 

builder.Register<IRepository>(c => new EFRepository(new EFDbContext())); 

ILifetimeScope container = builder.Build(); 
DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); 

:

public class AccountController : Controller 
{ 
    private readonly IRepository repository; 
    private readonly IMembershipService membershipService;   

    public AccountController(IRepository repo, IMembershipService mmbrSvc) 
    { 
     repository = repo; 
     membershipService = mmbrSvc; 
    } 
    [HttpPost]   
    public ActionResult Login(LoginViewModel viewModel) 
    { 
     if (!ModelState.IsValid)    
      return new HttpStatusCodeResult(HttpStatusCode.BadRequest);    

     string returnUrl = (string)TempData["ReturnUrl"]; 
     LoginDto accountDto = viewModel.GetLoginStatus(repository, membershipService, returnUrl); 
     string accountDtoJson = JsonHelper.Serialize(accountDto); 

     return Content(accountDtoJson, "application/json"); 
    } 
} 

T курица в LoginViewModel:

public LoginDto GetLoginStatus(IRepository repo, IMembershipService mmbrSvc, string returnUrl) 
    { 
     repository = repo; 
     membershipService = mmbrSvc; 

     User user = repository.FirstOrDefault<User>(x => x.Username == Username, x => x.Membership); 
    ............ 
    ............ 
    } 

ответ

2

Вы должны зарегистрировать DbContext себя AutoFac и дать ему соответствующий срок службы. InstancePerDependency обычно отлично подходит для хранилищ.

builder.RegisterType<EFDbContext>().AsSelf().InstancePerDependency(); 

Тогда вам не нужно, чтобы дать репозиторий зарегистрированных объект, просто зарегистрировать тип (напомним, указать срок службы, а):

builder.Register<EFRepository>().As<IRepository>().InstancePerLifetimeScope(); 
+0

Steve спасибо за предложение, я пытался builder.RegisterType () .AsSelf(). InstancePerDependency(); builder.RegisterType (). Как () .InstancePerLifetimeScope(); Но все равно получаю ту же ошибку. –

+0

@ AlexanderC.how вы на самом деле называете метод репозитория? – Steve

+0

через инъекцию зависимостей контроллера, а также впрыскивание зависимостей в других службах. builder.RegisterType (). (). InstancePerLifetimeScope(); –

Смежные вопросы