2009-10-14 93 views
2

我是一个新的asp.net程序员,我刚才问了this question,这让我更加笼统。Linq /数据对象最佳实践

关于Linq和数据对象的最新实践是什么?具体何时;暗淡,新的和处理它们。

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

如果有人可以给我关于当前最佳实践的悬崖笔记,或者甚至链接到描述它们的文章,我将不胜感激。

回答

0

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

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

对于在类型的函数范围内实例化数据上下文,实际上没有任何理由在函数中产生这种开销,除非类型的生命周期只保证函数调用本身的生命周期。即使现在情况如此,未来可能也不会有这种情况,所以最好在设计时考虑这种情况。

2

晨间的想法(我坐在一个会议,所以我不好)

对于ASP.NET,数据上下文的最大寿命是一个职位或回传。您可以创建更多的内容,但是它们都会随着页面卸载而死亡。是的,你应该明确地处理它们; using语句是来处理,因为当块结束它会自动调用配置的最佳途径:

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

这是一个从LINQ查询不与数据上下文消失返回的数据,但在这一点上它不再连接到上下文,并且更改不能用于更新数据库。 (您可以随时创建新的上下文,然后附加为新对象,或者重新查询并合并更改,或者任何符合您需要的更改。)

请注意,LINQ查询不会执行,直到需要评估数据。在处理数据上下文时保留查询是一个非常容易的错误,然后当查询需要运行时,它不能,因为它是使用不再存在的数据上下文创建的。有两种通用的方法来解决这个问题。

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

    列表myCustomers =(从C中nw.Customers选择C)。ToList();

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

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

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

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