.net 更新自跟踪实体时出现问题
我正在WCF客户机-服务器应用程序中使用实体。我的WCF服务返回各种实体,可以使用相应的更新方法更新这些实体 这在一段时间内效果不错,但现在我遇到了问题。为了保持重点,我将把讨论局限于一个具体的案例,简化为最基本的内容 我的一个表叫做SystemDefinition。它没有外键,但另一个表(路由)有一个外键。因此,它在实体模型中只有一个导航属性(称为路由)。所有其他列都是标量。表和相应的实体有一个名为Id的主键列,类型为Guid。数据库是SQL Server Compact v3.5 要重现问题,我可以:.net 更新自跟踪实体时出现问题,.net,ado.net-entity-data-model,self-tracking-entities,.net,Ado.net Entity Data Model,Self Tracking Entities,我正在WCF客户机-服务器应用程序中使用实体。我的WCF服务返回各种实体,可以使用相应的更新方法更新这些实体 这在一段时间内效果不错,但现在我遇到了问题。为了保持重点,我将把讨论局限于一个具体的案例,简化为最基本的内容 我的一个表叫做SystemDefinition。它没有外键,但另一个表(路由)有一个外键。因此,它在实体模型中只有一个导航属性(称为路由)。所有其他列都是标量。表和相应的实体有一个名为Id的主键列,类型为Guid。数据库是SQL Server Compact v3.5 要重现问题
另外,我发现一篇论坛帖子建议重写实体类上的GetHashCode()和Equals()方法可能会有所帮助。如果错误是由ObjectStateManager无法确定要更新的实体实际上与上下文中的某个实体相同而导致的,那么这将有一定意义。我尝试过(使用分部类),但很不幸,它没有帮助。所以现在我迷路了。欢迎提供任何建议。我怀疑您的
\u objectContext
已经包含您试图应用更改的实体实例。因为您的实体是从外部客户机接收的,所以它们(在实例引用方面)与上下文已经知道的那些实例永远不会相同
对于抛出的异常,这是有意义的:上下文以包含相同键值的两个不同实例结束
要解决这个问题,您只需确保始终使用新的上下文。这是完全正确的。我将单个对象上下文注入到WCF服务构造函数中,认为它是每次调用实例化的。结果是服务实例被重用,因此对象上下文已过时。我重写了服务,改为使用工厂,这就解决了问题。谢谢
_objectContext.SystemDefinitions.ApplyChanges(system);
_objectContext.SaveChanges();