正确使用DBContext

时间:2015-07-09 13:27:30

标签: c# entity-framework dbcontext

我有一个多个用户可以登录的应用程序。为此,我有一种存储DBContext对象的会话对象。但问题是,缓存的DBContext仅存储已登录用户的数据。当另一个用户也登录时,缓存的数据可能更旧,因为它将被第二个用户更改。

是否有一种概念性的方法来处理这个问题。我可以在每次执行数据库请求时创建它,而不是缓存DBContext对象。这是正确的方法还是有一种事件要知道数据库内容是否已更改?

1 个答案:

答案 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