2015-07-09 2 views
0

У меня есть приложение, в которое могут войти несколько пользователей. Для этого у меня есть объект сеанса, который хранит объект DBContext. Но проблема в том, что в кэше DBContext хранятся только данные зарегистрированного пользователя. Когда другой пользователь также входит в систему, тогда кэшированные данные, возможно, старше, потому что они будут изменены вторым пользователем.Правильное использование DBContext

Есть ли концептуальный способ справиться с этим. Вместо кэширования объекта DBContext я могу создать его каждый раз, когда я делаю запрос базы данных. Правильно ли это или есть какое-то событие, чтобы узнать, что содержимое базы данных изменено?

ответ

2

Вы не должны кэшировать объект DbContext каким-либо образом. DbContext автоматически поддерживает внутреннее состояние для нескольких пользователей.

Вы создаете новый контекст при открытии контроллера для ответа на запрос пользователя на данные. В Entity Framework 6 это будет выглядеть как

public class FeedItemController : ApiController 
{ 
    private LynxFeedAPI_Context db = new LynxFeedAPI_Context(); 

    // GET api/FeedItem 
    public IQueryable<FeedItem> GetFeedItems() 
    { 
     return db.FeedItems; 
    } 

Это делается по-разному в EF 7, где Startup.cs используется для настройки Dependency Injection

public void ConfigureServices(IServiceCollection services) 
    { 
     services.AddMvc(); 
     // Uncomment the following line to add Web API services which makes it easier to port Web API 2 controllers. 
     // You will also need to add the Microsoft.AspNet.Mvc.WebApiCompatShim package to the 'dependencies' section of project.json. 
     // services.AddWebApiConventions(); 

     services.Configure<AppSettings>(configuration.GetConfigurationSection("AppSettings")); 

     // Add EF services to the services container. 
     services.AddEntityFramework() 
      .AddSqlServer() 
      .AddDbContext<ApplicationDbContext>(options => 
       options.UseSqlServer(configuration["Data:DefaultConnection:ConnectionString"])); 

     services.AddSingleton<IApplicationDbContext, ApplicationDbContext>(); 

     services.AddSingleton<IProposalDataRepository, ProposalDataRepository>(); 
     services.AddSingleton<IPositionDataRepository, PositionDataRepository>(); 
     services.AddSingleton<IMandatoryReqDataRepository, MandatoryReqDataRepository>(); 
     services.AddSingleton<IRatedReqDataRepository, RatedReqDataRepository>(); 

    } 

и используется контроллером

public class ProposalController : Controller 
{ 
    private readonly IProposalDataRepository repProposal; 

    public ProposalController(IProposalDataRepository repository) { 
     repProposal = repository; 
    } 

    [HttpGet] 
    public IEnumerable<Proposal> GetAll() 
    { 
     return repProposal.SelectAll(); 
    } 

, где нет необходимости когда-либо звонить, чтобы создать новый DbContext

+0

Итак, правильный способ i s для создания нового объекта DBContext до того, как я начну запрос через LINQ? –

+0

Да, вы создаете новый контекст при открытии контроллера –

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