快速思考(我正在开会,真糟糕)
对于 ASP.NET,数据上下文的最长生命周期是一个 post 或 postback。您可以创建更多内容,但它们都会随着页面卸载而消失。是的,您应该明确处置它们; using 语句是最好的处理方式,因为它会在块结束时自动调用 dispose:
using (NorthwindModel nw = new NorthwindModel())
{
do stuff
}
从 LINQ 查询返回的数据不会随着数据上下文消失,但此时它不再连接到上下文,并且无法再使用更改来更新数据库。 (您始终可以创建一个新的上下文,然后作为新对象附加,或者重新查询和合并更改,或者满足您的需求。)
请注意,LINQ 查询在需要评估数据之前不会执行。在处理数据上下文时保留查询是一个非常容易的错误,然后当查询需要运行时,它不能,因为它是使用不再存在的数据上下文创建的。有两种一般的方法可以解决这个问题。
- 在数据上下文的 using 块内处理查询结果。
-
强制执行查询,通常使用 .ToList() 或其他会生成数据集合的方法:
List myCustomers = (from c in nw.Customers select c).ToList();
这会运行查询,将数据复制到一个可枚举的集合中,并为您提供一个可以返回给方法调用者的集合。但是,这些对象现在与上下文分离,因此它们不能用于更新。
如果您使用 LINQ 进行 CRUD,最好使用一个数据上下文进行所有更新、删除和插入,然后为所有更改调用一次 SubmitChanges()。这确保它们作为单个事务运行。 (如果没有正在运行的事务,数据上下文将为每个 SubmitChanges 调用生成一个事务。)
如果要在查询中选择一个项目,请使用 FirstOrDefault() 而不是 First()。如果没有任何内容符合选择条件,First() 将抛出异常,而 FirstOrDefault() 将返回 null。了解非常有用。
除此之外,玩得开心并尝试很多东西。 LINQ 将改变您对数据的看法。