我有一个多个用户可以登录的应用程序。为此,我有一种存储DBContext
对象的会话对象。但问题是,缓存的DBContext
仅存储已登录用户的数据。当另一个用户也登录时,缓存的数据可能更旧,因为它将被第二个用户更改。
是否有一种概念性的方法来处理这个问题。我可以在每次执行数据库请求时创建它,而不是缓存DBContext
对象。这是正确的方法还是有一种事件要知道数据库内容是否已更改?
答案 0 :(得分:2)
您不应该以任何方式缓存DbContext对象。 DbContext自动在内部为多个用户维护状态。
打开控制器以响应用户数据请求时,可以创建新上下文。在实体框架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用于设置依赖注入
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