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

How to change GUID of entity before saving back to database (in C#)

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

formatter.Serialize(fileStream, session); // BinaryFormatter

并反序列化:

session = (Session)binaryFormatter.Deserialize(innerStream);

实体结构比较复杂,有需要的话我可以想出一个更简单的例子,但问题的症结就在于此。有一个患者 table 有多个 "Sessions"。患者有一个关联的 table "Cities",这就是问题所在。每台计算机都有自己的数据库 (SQLServer Express),并且有一个包含完全相同数据的 table 个城市(伦敦、马德里、柏林)。然而,在每台机器上,城市的唯一键(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...

关于如何解决这个问题有什么想法吗?我可以创建全新的对象,但这是有问题的,因为如果我反序列化两个具有相同患者的会话,它们应该在新数据库中保持这种状态。我创建了新实体,我最终得到了 2 个新患者。

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

意见?

戴夫

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