【发布时间】:2011-08-14 18:36:45
【问题描述】:
我在 N 层环境中使用 L2S,并且在尝试通过网络发送关联实体时遇到问题。对于这个冗长的问题,我提前道歉,但这是一个非常具体的情况。
基本上我正在加载一个表,称为 Items,另一个表,称为 ItemMappings。 Items 和 ItemsMappings 以一对多的关系相关。所以每个 ItemMapping 都有一个 ItemId 属性。在 L2S 中,我在 Item 类中获得了 ItemMappings 的集合,并在 ItemMappings 类中获得了 Item 引用,这很棒。
但是,由于 N-Tier 环境,我设计了一些封装类,在客户端封装更改跟踪,以便在返回到服务器进行保存时可以检索它。这通过跟踪每个实体类型的更改来工作。这意味着我有一个项目跟踪集(TrackingSet
所以这意味着我通过网络分别发送 Items 和 ItemMappings(实际上它们是在一个容器中一起发送的,但就序列化而言,它们是分开的)。现在,如果我不干预序列化过程,那么项目集合的实际通过线路类似于以下伪 XML:
<items>
<item>
<itemId>1</itemId>
<itemMappings>
<itemMapping>
<itemId>1</itemId>
</itemMapping>
</itemMappings>
</item>
<item>
<itemId>2</itemId>
<itemMappings>
<itemMapping>
<itemId>2</itemId>
</itemMapping>
</itemMappings>
</item>
</items>
我想说明的是,序列化项目集合包括与项目关联的项目映射。但是因为实际上也发送了 item-mappings,所以实际上我最终发送了 item-mappings 集合两次:一次单独发送,一次嵌入到 items 集合中。这意味着我的电线占用空间太大了。
我想要做的是在我的容器类的 OnSerializing 方法中分离实体,只在 itemMapping 对象上留下项目 ID,然后在 OnDeserialized 方法中,根据这些 ID 重新关联它们。
不幸的是,在 OnSerializing 方法中,如果我将 ItemMapping.Item 属性设置为 null,然后尝试将 ItemID 属性设置为我刚刚设置为 null 的 Item 的 ID,则会收到臭名昭著的 ForeignKeyReferenceAlreadyHasValueException。只是有点让人生气:)
如果您对我的问题已经了解了这么多,我已经欠您感谢了。如果您理解我的问题并有任何建议,我将不胜感激。
【问题讨论】:
标签: .net linq-to-sql serialization n-tier-architecture