【问题标题】:Entity Framework 4 POCO Context Persistance Accross ServicesEntity Framework 4 POCO 跨服务的上下文持久性
【发布时间】:2010-07-23 11:51:28
【问题描述】:

我有一个 WCF 服务,它使用实体框架从数据库中检索记录并将它们映射到 POCO 对象。然后将这些 POCO 对象返回给客户端应用程序。

假设客户端应用程序更改了这些 POCO 对象之一的某些属性,然后将其发送回 WCF 服务以进行保存。据我所知,这个 POCO 对象与实体框架上下文完全断开。我目前保存的方法是创建一个新的上下文对象并再次从数据库中检索 POCO 对象,然后我将传递给方法的 POCO 对象的属性值复制到刚刚从数据库中检索的 POCO 对象中,然后调用 save语境上。这是最好的方法还是有更简单的方法?

【问题讨论】:

    标签: c# entity-framework


    【解决方案1】:

    这里的问题是 EF 通过为每个检索到的对象使用它自己的“唯一标识符”来跟踪附加对象,这与数据库中记录的主键不同。该属性当然没有用 DataMember 属性标记,因此当通过 WCF 服务发送时,您会丢失 EF 用来跟踪它的密钥。反序列化对象时,它不再是完全相同的对象,而是另一个更简单的对象,仅包含用 DataMember 属性标记的属性。所以当服务再次接收到它们时,你当然会失去对象和 EF 之间的连接。

    您是否尝试过将对象重新附加到上下文中?我认为它应该可以工作,但我自己还没有尝试过。

    【讨论】:

    • 您只需在表上调用 Attach 方法,将您的 POCO 实体作为参数提供。这很简单。 msdn.microsoft.com/en-us/library/bb896271.aspx
    • 谢谢,我刚刚尝试过,我可以使用 AttachTo 将其添加到上下文中,但是当我调用 context.SaveChanges() 时,更改不会反映在数据库中。我猜这是因为联系人认为它没有被更改所以没有保存它。
    • 发现了问题,因为更改跟踪已经丢失,您需要在附加后手动将其设置为已修改,方法是执行类似 context.ObjectStateManager.ChangeObjectState(service, EntityState.Modified);跨度>
    猜你喜欢
    • 2011-02-08
    • 1970-01-01
    • 2013-02-10
    • 2011-07-19
    • 2011-12-28
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多