LINQ-to-SQL表 .Attach做什么?

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

另外,请查看以下相关问题: 如何从DataContext的跟踪机制中分离LINQ-to-SQL数据对象?

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

精简版:

Attach()告诉DataContext该实体不是新的(用于插入 ),而是一个要在DB中更新的更新实体。

长版:

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

AttachAll()也适用于多个实体。

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

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