【问题标题】:Linq to Sql: Detaching/re-attaching entities for sending across the wireLinq to Sql:分离/重新附加实体以通过网络发送
【发布时间】: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


    【解决方案1】:

    在序列化过程中修改实例的属性肯定是个麻烦事!

    我建议使用一些用于查询数据库的类,以及用于有线表示的其他类。这将您的数据库与您的服务合同分离。

    public class ServiceResponse
    {
      public List<Item> TheItems {get;set;}
      public List<ItemMapping> TheMappings {get;set;}
    }
    
    public class Item
    {
      public int ItemId {get;set;}
      // TODO more properties, but no ItemMappings property
    }
    
    public class ItemMapping
    {
      public int ItemId {get;set;}
      // TODO more properties
    }
    

    【讨论】:

    • 发帖已经快一年了,恐怕这个问题与我无关了。不过,我希望其他人可以从您的回答中受益。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 2011-10-22
    • 1970-01-01
    • 2010-10-26
    • 1970-01-01
    相关资源
    最近更新 更多