gpt4 book ai didi

c# - 应该在每个事务上创建 EF dbContext

转载 作者:行者123 更新时间:2023-11-30 20:46:27 25 4
gpt4 key购买 nike

我正在尝试找出管理 DbContext 的最佳方法。我见过不处置的代码示例,我见过人们说这是个坏主意。我做下面这样的事情合适吗?另外,我是否应该将每个事务(包括读取)都放在一个新的 DbContext 中?这可能是另一个问题,但是关于 EntityState 的部分是否必要?

public abstract class GenericRepository<T> where T : EntityData
{
protected MyDbContext Context
{
get { return new MyDbContext(); }
}

public T Save(T obj)
{
T item;
using (var context = Context)
{
var set = context.Set<T>();

if (String.IsNullOrEmpty(obj.Id))
item = set.Add(obj);
else
{
item = set.Find(obj.Id);
item = obj;
}

// taken from another code sample
var entry = context.Entry(item);
if (entry.State == EntityState.Detached)
{
//Need to set modified so any detached entities are updated
// otherwise they won't be sent across to the db.
// Since it would've been outside the context, change tracking
//wouldn't have occurred anyways so we have no idea about its state - save it!
set.Attach(item);
context.Entry(item).State = EntityState.Modified;
}
context.SaveChanges();
}

return item;
}
}

编辑
我还有一个扩展类在下面实现了这个功能。上下文没有包含在此查询中的 using 语句中,因此我对我的代码有点怀疑。

public IQueryable<T> FindByAccountId(string accountId)
{
return from item in Context.Set<T>()
let user = UserRepository.FindByAccountId(accountId).FirstOrDefault()
where item.UserId == user.Id
select item;
}

最佳答案

上下文实际上应该基于每个请求。请求进来并创建一个新的上下文。此上下文用于请求的其余部分,然后在请求结束时相应地处理掉。这为您提供了请求长事务的好处,并且正如 HamidP 强调的那样,您还拥有缓存实体的额外好处;这意味着加载到上下文中的任何实体都可以通过检索来加载,而无需 Entity Framework 查询数据库。

如果您正在使用任何类型的控制反转容器,例如 StructureMap,那么您可以通过以下配置轻松创建 HTTP 请求绑定(bind)上下文:

this.For<DbContext>().HybridHttpOrThreadLocalScoped().Use<DbContext>();

然后您可以将您的 DbContext(或它的衍生物)注入(inject)您的存储库,并让您选择的 IOC 容器在请求结束时处理上下文。如果您要将相同的上下文注入(inject)另一个存储库,那么您将收到相同的上下文实例。

希望对您有所帮助!

关于c# - 应该在每个事务上创建 EF dbContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26923462/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com