LinqToSql声明和实例化的DataContext最佳做法?

问题描述 投票:15回答:5

是什么在我的扩展LinqToSql类设置我轻松访问的DataContext方面的最佳做法?

例如,我在我的dbml“用户”实体和我想的方法添加到类像这样:

Partial Public Class User

    Public Function GetUser(ByVal UserID as Integer) as User
         'Do Work
    End Function

End Class

为了访问我的DataContext我不得不这样声明的方法中:

Partial Public Class User

    Public Function GetUser(ByVal UserID as Integer) as User
         Dim dc as New MyDataContext()
         Return (From u in dc.Users Where u.ID = UserID).Single()
    End Function

End Class

我想没有这样做,对于每个单独的方法。通常情况下(如果我不延长LinqToSql的dbml类)我可能只是这样做:

Partial Public Class User
    Private dc as MyDataContext

    Public Sub New()
         dc = new MyDataContext()
    End Sub

    Public Function GetUser(ByVal UserID as Integer) as User
         Return (From u in dc.Users Where u.ID = UserID).Single()
    End Function

    Public Function GetAllUsers() as IEnumerable(Of User)
         Return From u in dc.Users
    End Function

    'etc...

End Class

这将使我访问DataContext的每个方法,而无需每次都重新申报。当然,你不能这样做,因为DBML已经有一个构造函数。如果有什么发生了改变,将代码添加到DBML总是被覆盖。

人对如何对自己在这里保存一些多余的代码有什么好的想法?

TIA!

.net vb.net linq-to-sql datacontext
5个回答
14
投票

首先,确保你在你的处置的DataContext时,你就大功告成了!他可以是一个沉重的小混蛋(编辑不重来实例化,但重保持周围,如果你继续使用它不用设置);你不想老DataContexts在内存中徘徊。

第二,在DataContext旨在表示一个单一的逻辑事务。例如。你应该创建一个新的,你要开始一个新的事务,每次,并摆脱它当交易完成。因此,对于你而言,这也许是GetUser方法的范围。如果你有一系列需要做出一个组DB的电话,他们都应该摆脱之前使用相同的DC。


12
投票

作为Rex M said,在DataContext旨在被实例化,使用,以及设置为每个逻辑事务。这样的模式有时也被称为“工作单位”。

最常见的方式(即我所知道的)这样做是为了实例化的DataContext在使用块。我没有在使用了一段VB,但它应该是这个样子:

Using dc As New MyDataContext()
   user = (From u in dc.Users Where u.ID = UserID).Single()
End Using

这不仅增强了工作的事务/单元的外观(通过代码的物理形状),但它可以确保您的datacontext当块结束时调用Dispose()。

this MSDN page

一般来说,一个DataContext实例设计寿命为一个“工作单位”但是你的应用程序定义的术语。一个DataContext是轻量级的,不昂贵创建。一个典型的LINQ到SQL的应用程序在方法范围或作为表示逻辑组相关的数据库操作的短命类的成员创建的DataContext实例。


0
投票

我想,也许真正的问题是,User可能是不适合的实例成员调用GetUser正确的地方。


0
投票

有几个不同的方式,你可以去这个问题,这将是很好的做法,我想。首先,你可以使用,你查询库的对象存储库模式,它超出到数据库,检索对象 - 也许从数据方面分离,或围绕保持数据上下文取决于库的实现 - 并返回给你。为对象的工厂方法将是对存储库,而不是实体本身。你可能会使用反射和泛型,以尽量减少你要实现和保持代码的DRY方法数。

另一种方法,并LINQtoSQL的用意是本地恕我直言使用的方式,是创建每组你打算执行数据库操作的数据上下文。在此的数据上下文的创建发生实体以外为好,一般在被在所有使用的实体,而不是在数据层的类。你也可以添加方法的数据上下文 - 让你的实际数据方面抽象,从它继承 - 再利用反射,来执行一些常见的检索功能,这样你就不必赘述。你可能不得不使用一个数据库格式,如:ActiveRecords其中ID列始终具有相同的名称,使这项工作。

在另一方面,你可以看看使用nHibernate或城堡的ActiveRecord,而不是复制上述任何一种在自己的解决方案。


0
投票

如果你独自离开User类,并允许IDE处理它的创作它可能会更容易。

我常常希望有一个单独的类处理数据检索。比方说,你把它叫做UserDataProvider和所有调用获得的用户实例最终通过这个类。

UserDataProvider的构造可以实例重复使用的数据上下文对象的全局实例。它看起来像这样(在C#和未经考验的代码,所以多多包涵):

public class UserDataProvider 
{
    private UserDataContext _data = null;

    public UserDataProvider()
    {
        _data = new UserDataContext();
    }

    public User GetUser(int userID)
    {
        return _data.Users.FirstOrDefault(u => u.UserID == userID);
    }
}

另外,您也可以放置在初始化属性和访问属性数据的情况下使用。

public class UserDataProvider 
{
    private UserDataContext _dataContext;

    private UserDataContext DataContext 
    {
        get
        {
            if (_data == null)
                _data = new UserDataContext();

            return _data;
        }
    }

    public User GetUser(int userID)
    {
        return DataContext.Users.FirstOrDefault(u => u.UserID == userID);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.