我们有代码将实体序列化为文件:
formatter.Serialize(fileStream, session); // BinaryFormatter
并反序列化:
session = (Session)binaryFormatter.Deserialize(innerStream);
实体结构非常复杂,如果有必要,我可以提出一个更简单的例子,但问题的症结在于此。有一个患者表有多个“会话”。患者有一个相关的表“城市”,其中存在问题。每台计算机都有自己的数据库(SQLServer Express),并且有一个包含完全相同数据的城市表(伦敦,马德里,柏林)。但是,在每台机器上,城市的唯一键(GUID)是不同的!当我在其序列化的另一台机器上反序列化会话时,我想使用基于名称的同一城市,而不是Guid。 反序列化工作正常。它是数据库的反序列化实体,让我感到悲伤。为了使City GUID正确,我使用:
session.Patient.City.CityGUID = tempCity.CityGUID;
session.Patient.CityGUID = tempCity.CityGUID;
tempCity是数据库中具有匹配名称的实体(如“伦敦”)。
我可以这样做,但在线:
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...
有关如何解决此问题的任何想法?我可以创建全新的对象,但这是有问题的,因为如果我反序列化两个具有相同患者的会话,它们应该保持在新数据库中。我创建了新的实体,最终我得到了2名新患者。
我认为最好的解决方案是确保城市在不同的计算机上具有相同的GUID,可能是通过修改安装集,但我想知道是否有一个简单的修复。
评论
戴夫
答案 0 :(得分:0)
实际上,我需要替换整个实体:session.Patient.City = tempCity;