LINQ-to-SQL Table<T>.Attach是什么?

17
2个回答

18

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

简短版本:

Attach() 方法告诉 DataContext 实体不是新实体(对于 插入),而是一个要在数据库中进行更新的已更新实体。

详细版本:

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

AttachAll() 方法也是如此,但适用于多个实体。


因此,它类似于对表进行PK搜索以查找匹配项,并从分离的数据对象更新记录。 - smartcaveman
1
@smartcaveman:是的。DataContext开始跟踪附加的实体。请记住,您不应该为附加到另一个DataContext的实体执行此操作 - 仅对分离的实体使用它。如果没有Attach,您的实体将被标记为新插入的。当然,当您要求更新时才会执行更新本身 - 而不是在调用Attach时。 - Jaroslav Jandek
@smartcaveman:这可能为您解释了:它将标记实体以进行更新,因此在保存时将执行“PK搜索”而不是直接的“INSERT”。 - Jaroslav Jandek
1
使用 Attach(object,True)(需要某个版本号或禁用跟踪)或 Attach(objectModified, objectOriginal),它会计算出更改的内容并进行更新。仅仅附加似乎没有任何作用。 - Piotr Kula

4
LINQ to SQL维护DataContext对象中实体的状态。从数据库加载的实体与负责跟踪实体更改的DataContext相关联,因此在保存实体时,将对数据库进行适当的更改。
当序列化实体(例如,在n层应用程序中将其传递给客户端)时,实体可能会与DataContext分离。当客户端将实体返回到您的DA层时,您需要重新将其附加到DataContext,然后才能更新或删除数据库中的实体。Attach方法执行此操作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接