Linq /数据对象的最佳实践

时间:2009-10-14 21:19:16

标签: linq data-entry

我是一名新的asp.net程序员,我刚刚问this question,这给我留下了更为通用的程序。

目前关于Linq和数据对象的最佳做法是什么?特别是什么时候;昏暗,新,并处置它们。

还有在同一页面上的许多不同范围中使用的对象,例如用户数据对象。它们应该是模块级别还是在每个范围内创建?

如果有人可以给我关于当前最佳实践的悬崖说明,甚至是描述它们的文章的链接,我将非常感激。

2 个答案:

答案 0 :(得分:2)

快速思考(我正坐在会议中,我很糟糕)

对于ASP.NET,数据上下文的最长生命周期是一个帖子或回发。你可以创建更多,但他们都将死于页面卸载。是的,你应该明确处理它们; using语句是处理它的最佳方法,因为它会在块结束时自动调用dispose:

using (NorthwindModel nw = new NorthwindModel())
{
    do stuff
}

从LINQ查询返回的数据不会随数据上下文消失,但此时它不再连接到上下文,并且更改不能再用于更新数据库。 (您始终可以创建新上下文,然后作为新对象附加,或者重新查询和合并更改,或者满足您需求的任何内容。)

非常清楚LINQ查询在需要评估数据之前不会执行。在数据上下文被释放时保持查询是一个非常容易的错误,然后当查询需要运行时,它不能,因为它是使用不再存在的数据上下文创建的。有两种方法可以解决这个问题。

  1. 在数据上下文的using块内处理查询结果。
  2. 强制执行查询,通常使用.ToList()或其他一些生成数据集合的方法:

    列出myCustomers =(来自c in nw.Customers select c).ToList();

  3. 这会运行查询,将数据复制到可枚举的集合中,并为您提供可以返回给方法调用者的集合。但是,这些对象现在与上下文分开,因此它们不能用于更新。

    如果您正在使用LINQ进行CRUD,最好为所有更新,删除和插入使用一个数据上下文,然后对所有更改调用SubmitChanges()一次。这可确保它们作为单个事务运行。 (如果没有正在运行的事务,数据上下文将为每个SubmitChanges调用生成一个事务。)

    如果要在查询中选择一个项目,请使用FirstOrDefault()而不是First()。如果没有符合选择标准,First()将抛出异常,而FirstOrDefault()将返回null。知道非常有用。

    除此之外,玩得开心并尝试很多东西。 LINQ将改变您对数据的看法。

答案 1 :(得分:0)

通常,您希望将作为参数操作的数据作为构造函数参数传递给函数和类型的依赖项。因此,例如linq数据上下文可能是您的类型依赖于操作的东西,因此应该在构造函数中注入。用于在上下文中查找数据的值将快速更改并重复用于相同的上下文,因此将是您类型的函数参数。

如果您的类型是为了在其生命周期内对多个上下文执行操作而构建的,那么您可以考虑将上下文作为函数参数传递,但这可能表明设计问题比其他任何事情更重要。

至于在一个类型的函数作用域内实例化数据上下文,除非你的类型的生命周期保证只持续函数调用本身的生命周期,否则没有任何理由在你的函数中有这种开销。即使现在就是这种情况,也可能在未来的某个时候,所以考虑到这种情况,设计你的类型仍然会更好。