【问题标题】:What does LINQ-to-SQL Table<T>.Attach do?LINQ-to-SQL Table<T>.Attach 有什么作用?
【发布时间】:2011-07-11 18:34:57
【问题描述】:

LINQ-to-SQL 方法 Table&lt;T&gt;.Attach()Table&lt;T&gt;.AttachAll() 究竟是什么?正确使用它们的示例/情况是什么?

另外,请查看这个相关问题:How to detach a LINQ-to-SQL data object from the DataContext's tracking mechanism?

【问题讨论】:

    标签: c# linq linq-to-sql datacontext


    【解决方案1】:

    在将数据序列化/反序列化到其他层的多层应用程序中非常有用。

    短版:

    Attach() 告诉 DataContext 实体不是新的(对于 insert),而是一个更新的实体,应该在数据库。

    长版:

    您有一个 DataContext,您的实体存在于其中。插入新实体,更新现有实体。现在您需要将某个实体发送到另一层,DataContext 然后分离所述实体并将其发送出去。
    在另一层,实体被修改并发送回您的数据层。现在拥有您的实体的前 DataContext 可能不再存在(例如,如果它是无状态的)或者不知道您的反序列化实体,那么您该怎么办?您创建一个新的 DataContext 或使用现有的并使用 Attach() 方法 - 这样 DataContext 知道该实体意味着要更新 并且不应插入到数据库中。

    AttachAll() 也是如此,但对于多个实体。

    【讨论】:

    • 那么,它会执行类似 PK 搜索表中的匹配项并从分离的数据对象更新记录?
    • @smartcaveman:是的。 DataContext 开始跟踪附加的实体。请记住,您不应该对附加到另一个 DataContext 的实体执行此操作 - 仅将其用于分离的实体。如果没有附加,您的实体将被标记为新插入。当然,更新本身会在您提出要求时执行 - 而不是在您致电 Attach 时执行。
    • @smartcaveman:这可能会为您解释:它将标记实体进行更新,因此它将“执行PK搜索”而不是直接“插入”保存发生。
    • 使用Attach(object,True)(需要一些版本号或禁用跟踪)或Attach(objectModified, objectOriginal),它可以计算出发生了什么变化,然后进行更新。只是附加似乎没有任何作用。
    【解决方案2】:

    LINQ to SQL 维护 DataContext 对象中实体的状态。从数据库加载的实体与负责跟踪对实体的任何更改的 DataContext 相关联,因此当您保存它时,会对数据库进行适当的更改。

    实体在序列化时可能会与 DataContext 分离(用于传递给客户端,例如在 n 层应用程序中)。当客户端将实体返回到您的 DA 层时,您需要将其重新附加到 DataContext,然后才能在数据库中更新或删除它。 Attach 方法执行此操作。

    【讨论】:

      猜你喜欢
      • 2011-01-27
      • 1970-01-01
      • 1970-01-01
      • 2011-01-20
      • 1970-01-01
      • 1970-01-01
      • 2021-10-25
      • 1970-01-01
      • 2010-12-02
      相关资源
      最近更新 更多