MVC中的NonShared DbContext是一种不好的做法吗?

时间:2013-04-06 14:22:04

标签: asp.net-mvc performance entity-framework mef

这是一个MVC应用程序,其实体框架代码优先用于ORM,MEF用作IoC。 如果我用DbContext标记PartCreationPolicy.Shared,则每次尝试执行编辑时都会出现错误,说明该对象已存在于容器中。 但是如果我只是用DbContext标记PartCreationPolicy.NonShared以便为每个请求创建它,该怎么办? 是否有可怕的性能影响?

更新 以下是保存代码:

Provider IRepository<Provider>.Put(Provider item)
        {
            if (item.Id == Guid.Empty)
            {
                item.Id = Guid.NewGuid();
                this.Providers.Add(item);
            }
            else this.Entry<Provider>(item).State = EntityState.Modified;
            return item;
        }

这是在共享

时的错误
  

ObjectStateManager中已存在具有相同键的对象。   ObjectStateManager无法跟踪具有相同对象的多个对象   键。

1 个答案:

答案 0 :(得分:3)

你绝对应该使用PartCreationPolicy.NonShared。你可以阅读关于上下文生命周期管理的一切,无论是linq到sql,实体框架还是NHibernate(会话),都会同意一件事:上下文应该是短暂的。一个简单的经验法则是:将它用于一个工作单元,这意味着:创建一个上下文,做一些事情,调用SaveChanges一次,处理。大多数时候,这条规则对我来说很有效。

共享(或单例)上下文是影响性能的模式,因为上下文会随着时间的推移而膨胀。更改跟踪器需要跟踪越来越多的对象,关系修复将变慢。你会发现自己一次又一次刷新(重新加载)实体。