EF中的工作单元格是什么?

haa*_*nsi 37 .net c# design-patterns entity-framework

我正在学习EF并且已经看过很多例子,在我学习的过程中,我开始了解使用存储库和工作单元模式.我知道为什么要使用存储库但我对工作单元的理解还不是.

没有理解使DAL理解变得困难.请指导我.

谢谢

Ivo*_*Ivo 34

DataContext或ObjectContext是工作单元.

因此,您的DAL将保存,删除和检索对象,您的DataContext/ObjectContext将跟踪您的对象,管理事务并应用更改.

这是一个例子,只是为了说明解决方案的想法.

using(var context = new ObjectContext()) { // Unit of Work
    var repo = new ProductRepository(context);
    var product = repo.GetXXXXXXX(...);
    ...

    // Do whatever tracking you want to do with the object context. For instance:
    // if( error == false) { 
    //     context.DetectChanges();
    //     context.SaveChanges(SaveOptions.AcceptAllChangesAfterSave);
    // }
}
Run Code Online (Sandbox Code Playgroud)

您的存储库将如下所示:

public abstract class Repository {

    public Respository(ObjectContext context){
        CurrentContext = context;
    }

    protected ObjectContext CurrentContext { get; private set; } 
}

public class ProductRespository : Repository {
    public ProductRespository(ObjectContext context) : base(context){
    }

    public Product GetXXXXXX(...){
        return CurrentContext... ; //Do something with the context
    }
}    
Run Code Online (Sandbox Code Playgroud)

另一种方法是全局放置工作单元(对象上下文):

您需要定义您的工作单元范围.对于此示例,它将是Web请求.在现实世界的实现中,我会使用依赖注入.

public static class ContextProvider {

    public static ObjectContext CurrentContext {
        get { return HttpContext.Items["CurrentObjectContext"];
    }

    public static void OpenNew(){
        var context = new ObjectContext();
        HttpContext.Items["CurrentObjectContext"] = context; 
    }

    public static void CloseCurrent(){
        var context = CurrentContext;
        HttpContext.Items["CurrentObjectContext"] = null;
        // Do whatever tracking you want to do with the object context. For instance:
        // if( error == false) { 
        //     context.DetectChanges();
        //     context.SaveChanges(SaveOptions.AcceptAllChangesAfterSave);
        // }
        context.Dispose();
    }
}
Run Code Online (Sandbox Code Playgroud)

在此示例中,ObjectContext是工作单元,它将存在于当前请求中.在您的全局asax中,您可以添加:

protected void Application_BeginRequest(object sender, EventArgs e){
    ContextProvider.OpenNew();
}

protected void Application_EndRequest(object sender, EventArgs e){
    ContextProvider.CloseCurrent();
}
Run Code Online (Sandbox Code Playgroud)

在您的存储库中,您只需致电 ContextProvider.CurrentContext


Dee*_*eep 26

企业软件开发中最常见的设计模式之一是工作单元.根据Martin Fowler的说法,工作单元模式 "维护一个受业务事务影响的对象列表,并协调写入更改和解决并发问题."

工作单元模式不一定是您自己明确构建的模式,但模式几乎出现在我所知道的每个持久性工具中.NHibernate中的ITransaction接口,LINQ to SQL中的DataContext类和实体框架中的ObjectContext类都是工作单元的示例.就此而言,古老的DataSet可以用作工作单元.

有关详细信息,请单击此处阅读本文,这是一个很好的.

有关在ASP.NET MVC(MVC 4和EF 5)应用程序中实现存储库和工作单元模式的教程(第9步,共10步),请单击此处

有关EF 6和MVC 5的教程,请单击此处

我希望这会有所帮助,它帮助了我!

在此输入图像描述


Mat*_*all 14

工作单位

维护受业务事务影响的对象列表,并协调写入
更改和并发问题的解决方案.

在此输入图像描述

当您将数据导入和导出数据库时,跟踪您已更改的内容非常重要; 否则,该数据将不会被写回数据库.同样,您必须插入您创建的新对象并删除您删除的任何对象.

您可以在每次更改对象模型时更改数据库,但这会导致大量非常小的数据库调用,最终会非常慢.此外,它要求您为整个交互打开一个事务,如果您有一个跨越多个请求的业务事务,这是不切实际的.如果您需要跟踪已读取的对象,情况会更糟,这样可以避免读取不一致.

工作单元会跟踪您在业务事务中可能影响数据库的所有操作.完成后,它会计算出因工作而需要更改数据库的所有操作.

http://martinfowler.com/eaaCatalog/unitOfWork.html

  • 这不是一个真正的答案.您刚刚从资源中复制并粘贴了描述. (16认同)
  • @MartinBean:问题的一部分是"我真的不了解工作单位." 由于M.Fowler写得很好,引用的摘录是关于主题的.链接是不够的,因为仅链接的答案因其能够被破坏而非常讨厌.因此,提供链接并复制描述似乎是简约的有效部分答案.简约,局部,但仍然是一个答案.这当然是我的个人意见. (12认同)
  • 那ef呢? (2认同)