【问题标题】:Linq / data object best practicesLinq / 数据对象最佳实践
【发布时间】:2009-10-14 21:19:15
【问题描述】:

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

关于 Linq 和数据对象的当前最佳做法是什么?具体何时;暗淡、新的并丢弃它们。

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

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

【问题讨论】:

    标签: linq data-entry


    【解决方案1】:

    快速思考(我正在开会,真糟糕)

    对于 ASP.NET,数据上下文的最长生命周期是一个 post 或 postback。您可以创建更多内容,但它们都会随着页面卸载而消失。是的,您应该明确处置它们; using 语句是最好的处理方式,因为它会在块结束时自动调用 dispose:

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

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

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

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

      List myCustomers = (from c in nw.Customers select c).ToList();

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

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

    如果要在查询中选择一个项目,请使用 FirstOrDefault() 而不是 First()。如果没有任何内容符合选择条件,First() 将抛出异常,而 FirstOrDefault() 将返回 null。了解非常有用。

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

    【讨论】:

      【解决方案2】:

      通常,您希望将正在操作的数据作为参数传递给函数,并将类型的依赖项作为构造函数参数。因此,例如 linq 数据上下文可能是您的类型所依赖的操作,因此应该注入构造函数中。您用于在上下文中查找数据的值会迅速变化并在同一上下文中重复使用,因此将成为您类型上的函数参数。

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

      至于在一个类型的函数范围内实例化数据上下文,实际上没有任何理由在你的函数中产生这种开销,除非你的类型的生命周期保证只持续函数调用本身的生命周期。即使现在是这种情况,但在未来的某个时候可能不会,因此最好在设计类型时考虑到这种情况。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-31
        • 2010-10-04
        • 2023-03-25
        • 1970-01-01
        • 1970-01-01
        • 2011-07-12
        相关资源
        最近更新 更多