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

时间:2015-10-07 17:10:36

标签: sql-server entity-framework entity-framework-6 deserialization

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

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,可能是通过修改安装集,但我想知道是否有一个简单的修复。

评论

戴夫

1 个答案:

答案 0 :(得分:0)

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