1

它是一个 MVC 应用程序,具有用于 ORM 的实体框架代码优先和作为 IoC 的 MEF。如果我将 标记为DbContextPartCreationPolicy.Shared则每次尝试执行编辑时都会显示该对象已存在于容器中。但是,如果我简单地标记DbContextwithPartCreationPolicy.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 无法跟踪具有相同键的多个对象。

4

1 回答 1

3

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

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

于 2013-04-06T15:55:23.053 回答