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

标签 c# .net entity-framework dbcontext

我正在尝试找出管理 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/

相关文章:

c# - 如何使用 System.Net.HttpListener 在 WebSocket 中启用 SSL

.net - 将 Web.config 从 .NET 2.0 转换为 3.5

c# - Entity Framework 将原始 SQL 查询绑定(bind)到模型类

c# - Linq Where Contains ...保持默认顺序

c# - Entity Framework 4.2“该类型不具有 EdmEntityTypeAttribute 属性,但包含在具有 EdmSchemaAttribute 属性的程序集中

c# - 通过 USB 连接模拟设备

c# - 如何获取应用程序的AppData VirtualStore路径?

c# - 如何根据日期创建文件?

c# - 用C#读取(用Filesystem.FileGet)VB6记录文件(用Put写)

C# 向文本文件添加行号