这是一个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无法跟踪具有相同对象的多个对象 键。
答案 0 :(得分:3)
你绝对应该使用PartCreationPolicy.NonShared
。你可以阅读关于上下文生命周期管理的一切,无论是linq到sql,实体框架还是NHibernate(会话),都会同意一件事:上下文应该是短暂的。一个简单的经验法则是:将它用于一个工作单元,这意味着:创建一个上下文,做一些事情,调用SaveChanges
一次,处理。大多数时候,这条规则对我来说很有效。
共享(或单例)上下文是影响性能的模式,因为上下文会随着时间的推移而膨胀。更改跟踪器需要跟踪越来越多的对象,关系修复将变慢。你会发现自己一次又一次刷新(重新加载)实体。