Entity framework 如何为实体框架4创建静态UnitOfWork?

Entity framework 如何为实体框架4创建静态UnitOfWork?,entity-framework,entity-framework-4,unitofworkapplication,Entity Framework,Entity Framework 4,Unitofworkapplication,考虑到这门课 public class XQueries { public IQueryable Query1() { using (XEntities context = new XEntities()) { return something; } } public IQueryable Query2() { using (XEntities context = n

考虑到这门课

public class XQueries
{
    public IQueryable Query1()
    {
        using (XEntities context = new XEntities())
        {
            return something;
        }
    }

    public IQueryable Query2()
    {
        using (XEntities context = new XEntities())
        {
            return somethingElse;
        }
    }
}

是否为每个(xenties context=new xenties()){…}创建了到数据库的连接?如果是这样的话,创建静态UnitOfWork类以便只存在一个连接的正确方法是什么?

实体框架仅在需要时打开连接,例如执行查询或调用SaveChanges,然后在操作完成时关闭连接

来自Martin Fowler的书《关于工作单元的企业应用程序体系结构模式》

当您从中提取数据时 一个数据库,保存它很重要 追踪你改变了什么; 否则,将不会写入该数据 返回数据库。同样地你 必须插入您创建的新对象 并删除您删除的所有对象

您可以使用每个选项更改数据库 更改为对象模型,但 会导致很多非常小的问题 数据库调用,最终被 非常慢。而且它需要你 为客户打开一个交易 整个互动,这是 如果你有生意,那就不切实际了 跨多个数据库的事务 请求。情况更糟 如果您需要跟踪 您阅读过的对象,以便避免 不一致的阅读

一个工作单元跟踪 你在工作中所做的一切 可能影响交易的交易 数据库当你完成后,它就会出现 把需要做的事情都说出来 由于以下原因而更改数据库: 你的工作

每当我为客户机使用实体框架时(我承认这是罕见的),ObjectContext对象就是系统的工作实现单元。也就是说,ObjectContext将在某种程度上满足上述三条语句。使用ObjectContext不会过多地关注绝对正确的定义,这会让事情变得更简单


对DI/IoC和存储库模式进行一些研究,这将为您处理问题提供更大的灵活性。

实体框架仅在需要时打开连接,例如执行查询或调用SaveChanges,然后在操作完成时关闭连接

来自Martin Fowler的书《关于工作单元的企业应用程序体系结构模式》

当您从中提取数据时 一个数据库,保存它很重要 追踪你改变了什么; 否则,将不会写入该数据 返回数据库。同样地你 必须插入您创建的新对象 并删除您删除的所有对象

您可以使用每个选项更改数据库 更改为对象模型,但 会导致很多非常小的问题 数据库调用,最终被 非常慢。而且它需要你 为客户打开一个交易 整个互动,这是 如果你有生意,那就不切实际了 跨多个数据库的事务 请求。情况更糟 如果您需要跟踪 您阅读过的对象,以便避免 不一致的阅读

一个工作单元跟踪 你在工作中所做的一切 可能影响交易的交易 数据库当你完成后,它就会出现 把需要做的事情都说出来 由于以下原因而更改数据库: 你的工作

每当我为客户机使用实体框架时(我承认这是罕见的),ObjectContext对象就是系统的工作实现单元。也就是说,ObjectContext将在某种程度上满足上述三条语句。使用ObjectContext不会过多地关注绝对正确的定义,这会让事情变得更简单


对DI/IoC和存储库模式进行一些研究,这将为您处理问题提供更大的灵活性。

您无法创建静态工作单元,因为根据定义,工作单元是一个短期对象。因为EF
ObjectContext
是围绕工作单元模式设计的,所以在应用程序的生命周期中使用单个
ObjectContext
实例是个坏主意。这有几个原因

首先,
ObjectContext
类不是线程安全的。这意味着在一个用户的工作单元期间(例如在web应用程序中),另一个用户可以提交他的工作单元。当它们共享相同的
ObjectContext
时,这意味着在这种情况下,只有一半的更改被持久化,并且更改不是事务性的。幸运的话,
ObjectContext
会失败并引发异常。如果运气不好,您会破坏
ObjectContext
和safe,并将垃圾从数据库加载到数据库,了解应用程序何时在生产环境中运行(当然,在测试和转移过程中,一切似乎都正常)


其次,
ObjectContext
有一种缓存机制,其设计目的是使其寿命短。当从数据库中检索实体时,它将保留在
ObjectContext
的缓存中,直到该实例被垃圾回收。当您使该实例长时间处于活动状态时,实体就会过时。尤其是如果特定的
ObjectContext
实例不是唯一写入该数据库的实例。

您无法创建静态工作单元,因为根据定义,工作单元是一个短期对象。因为EF
ObjectContext
是围绕工作单元模式设计的,所以在应用程序的生命周期中使用单个
ObjectContext
实例是个坏主意。这有几个原因

首先,
ObjectContext
类不是线程安全的。这意味着在一个用户的工作单元期间(例如在web应用程序中),另一个用户可以提交他的工作单元。当它们共享相同的
ObjectContext
时,这意味着在这种情况下,只有一半的更改被持久化,而更改不会被转换