【问题标题】:One DataContext For Linq To SQL While Using Repository Pattern使用存储库模式时 Linq To SQL 的一个 DataContext
【发布时间】:2012-02-21 07:55:47
【问题描述】:

我是 .NET C# 开发的新手,最近开始在我的大部分数据访问层中使用 LINQ to SQL。不幸的是,我一直在努力解决如何管理我的 DataContext 以便我不会遇到由于实体未附加到上下文或尝试将实体附加到一个上下文而将其附加到另一个上下文而导致的可怕异常。经过大量阅读,我相信对我的应用程序来说最好的解决方案是在我的应用程序的整个过程中保持 DataContext 处于打开状态。

简而言之,我正在使用存储库模式为我的上下文管理的所有实体实现基本的 CRUD 操作(即创建、读取、更新和销毁)。下面包括我对存储库的实现。除了存储库之外,我还为每个具有更具体的数据访问方法(即 CustomerDAO.getCustomerByName(string name) 等)的实体提供了 DAO(数据访问对象)。我的每个 Windows 窗体都有自己的一个或多个 DAO 实例(扩展存储库),并且存储库中的 DataContext 是静态的。我遇到的问题是,即使我在下面的存储库类中的 DataContext 被声明为静态,我发现每个不同的 DAO 实际上都获得了不同的 DataContext 实例。例如,如果我有 8 个对 CustomerDAO 的引用,它们都具有相同的 DataContext。但是,如果我创建了一个 WorkOrderDAO,我会得到另一个 DataContext 实例,并且 WorkOrderDAO 的所有未来实例都会得到这个相同的 DataContext。更具体地说,我在以下场景中发现了这一点。

1) 使用 WorkOrderDAO 的实例将所有 WorkOrders 加载到 ListView - 有一个 DataContext 2) 使用 WorkOrderJobsDAO 的实例来尝试删除 WorkOrder 上的一个作业。这是 WorkOrder 上的一个集合。有不同的 DataContext,所以我无法附加

这是我如何实现下面的存储库的问题吗?我能想到的解决这个问题的唯一方法是创建一个存储库用来获取其 DataContext 的 Singleton。任何人都可以在这里就我应该如何管理上下文提出任何建议吗?

public class Repository<T> : IRepository<T>
where T : class
{
    private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
    protected static DomainClassesDataContext db = new DomainClassesDataContext();
    private static bool dataContextOptionsInitialized = false;

    public Repository()
    {
        if (!dataContextOptionsInitialized)
        {
            db.DeferredLoadingEnabled = true;
            dataContextOptionsInitialized = true;
        }
    }
    public void AddEntity(T entity)
    {
        GetTable.InsertOnSubmit(entity);
        SaveAll();
    }

    public void DeleteEntity(T entity, bool attach)
    {
        if(attach)
            GetTable.Attach(entity);

        GetTable.DeleteOnSubmit(entity);
        SaveAll();

    }

    public void UpdateEntity(T entity, bool attach)
    {
        if(attach)
            GetTable.Attach(entity, true);
        SaveAll();

    }

    public System.Data.Linq.Table<T> GetTable
    {
        get { return db.GetTable<T>(); }
    }

    public IEnumerable<T> All()
    {
        return GetTable;
    }

    public void SaveAll()
    {
        db.SubmitChanges();

    }
}

【问题讨论】:

  • 这是网络应用还是桌面应用?
  • 这是一个基本的桌面应用程序,它将处理服务工作订单和船舶维修估算。
  • 然后用 WinForms 或 WPF 标记您的问题会很有帮助,这样 Web 开发人员在看到您打开 DataContext 的建议时不会晕倒,同时也能引起对您问题的正确关注.我会删除数据库标签并用它替换它。
  • 感谢您的提示。我现在会根据您的建议采取行动。

标签: c# sql winforms linq datacontext


【解决方案1】:

C# 中的泛型类在编译时会“扩展”,因此您的存储库将是与存储库不同的类,这就是静态变量是 DTO 之间不同实例的原因。所以是的,你可能想把它保存在其他地方,比如 Singleton 类。

【讨论】:

  • 谢谢,我创建了一个 Singleton 类,它现在存储我认为适用于我当前设计的上下文。一般来说,这个实现对我如何实现数据访问层有意义吗?基本上,我所有的 DAO 都扩展了 Repository 并添加了额外的数据访问方法。放弃泛型类并编写一个在其中包含 linq 查询以执行基本操作的泛型 dao 会更好吗?我仍在努力熟悉这些泛型类。
猜你喜欢
  • 1970-01-01
  • 2011-04-29
  • 1970-01-01
  • 2010-09-23
  • 1970-01-01
  • 1970-01-01
  • 2011-01-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多