Sql server 如何在保存回数据库之前更改实体的GUID(在C中)

Sql server 如何在保存回数据库之前更改实体的GUID(在C中),sql-server,entity-framework,entity-framework-6,deserialization,Sql Server,Entity Framework,Entity Framework 6,Deserialization,我们有将实体序列化到文件的代码: formatter.Serialize(fileStream, session); // BinaryFormatter 以及反序列化: session = (Session)binaryFormatter.Deserialize(innerStream); 实体结构非常复杂,如果有必要,我可以给出一个更简单的例子,但是问题的关键是这个。有一个具有多个会话的患者表。患者有一个相关的表格,其中存在问题。每台计算机都有自己的数据库SQLServerExpress

我们有将实体序列化到文件的代码:

formatter.Serialize(fileStream, session); // BinaryFormatter
以及反序列化:

session = (Session)binaryFormatter.Deserialize(innerStream);
实体结构非常复杂,如果有必要,我可以给出一个更简单的例子,但是问题的关键是这个。有一个具有多个会话的患者表。患者有一个相关的表格,其中存在问题。每台计算机都有自己的数据库SQLServerExpress,并有一个表Cities,其中包含与伦敦、马德里、柏林完全相同的数据。但是,在每台计算机上,城市a GUID的唯一键是不同的!当我在另一台机器上反序列化一个会话时,我希望根据名称而不是Guid使用同一个城市。 反序列化工作得很好。是数据库中的反序列化实体让我感到悲伤。要获得正确的城市GUID,我使用:

session.Patient.City.CityGUID = tempCity.CityGUID;
session.Patient.CityGUID = tempCity.CityGUID;    
tempCity是数据库中的实体,其匹配名称如“London”

我可以这样做,但在网上:

context.Patients.Attach(session.Patient);
我得到一个例外的形式:

[System.InvalidOperationException] = {System.InvalidOperationException: The property 'CityGUID' is part of the object's key information and cannot be modified. 
at System.Data.Entity.Core.Objects.EntityEntry.DetectChangesInProperty(Int32 ordinal, Boolean detectOnlyComplexProperties, Boolea...
有没有办法解决这个问题?我可以创建全新的对象,但这是有问题的,因为如果我反序列化两个会话,它们都有相同的患者,那么它们应该在新数据库中保持这种方式。我创造了新的实体,最后我有了两个新的病人

我认为最好的解决方案是确保城市在不同的机器上有相同的guid,也许可以通过修改安装集,但我想知道是否有一个简单的修复方法

意见


Dave

事实上,我需要替换整个实体:session.Patient.City=tempCity

患者也是反序列化对象吗?顺便问一下,什么是session.Patient.Cities?看起来像一个集合,它怎么可能有guid?谢谢阅读我的问题Gert。是的,Patient也是反序列化对象。患者有一个或多个疗程。一名患者与一个且仅与一个城市关联。为了混淆专有信息,我输入了一个错误。它应该读session.Patient.City。我正在编辑这个问题来解决它。感谢您这样的人,您可以简单地从对象图中删除城市对象。设置session.Patient.CityGUID足以建立关联。事实上,我需要替换整个实体:session.Patient.City=tempCity;