Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net Linq到Sql:分离/重新附加用于跨线发送的实体_.net_Linq To Sql_Serialization_N Tier Architecture - Fatal编程技术网

.net Linq到Sql:分离/重新附加用于跨线发送的实体

.net Linq到Sql:分离/重新附加用于跨线发送的实体,.net,linq-to-sql,serialization,n-tier-architecture,.net,Linq To Sql,Serialization,N Tier Architecture,我在N层环境中使用L2S,在尝试跨线路发送关联实体时遇到问题。我为这个冗长的问题提前道歉,但这是一个非常具体的情况 基本上,我加载一个表,称之为Items,另一个表,称之为ItemMappings。项目和项目映射以一对多的关系进行关联。因此,每个ItemMapping都有一个ItemId属性。在L2S中,我在Item类中得到一组ItemMappings,在ItemMappings类中得到一个Item引用,这非常好 但是,由于N层环境的原因,我设计了一些包装器类来封装客户端的更改跟踪,以便在返回到

我在N层环境中使用L2S,在尝试跨线路发送关联实体时遇到问题。我为这个冗长的问题提前道歉,但这是一个非常具体的情况

基本上,我加载一个表,称之为Items,另一个表,称之为ItemMappings。项目和项目映射以一对多的关系进行关联。因此,每个ItemMapping都有一个ItemId属性。在L2S中,我在Item类中得到一组ItemMappings,在ItemMappings类中得到一个Item引用,这非常好

但是,由于N层环境的原因,我设计了一些包装器类来封装客户端的更改跟踪,以便在返回到服务器进行保存时可以检索更改跟踪。这通过跟踪每个实体类型的更改来实现。这意味着我有一个项目跟踪集(TrackingSet) 因此,这意味着我将通过网络分别发送项和项映射(实际上它们在一个容器中一起发送,但就序列化而言,它们是分开的)。现在,如果我不干预序列化过程,items集合的实际连接方式类似于以下伪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>

1.
1.
2.
2.
我试图用它来说明的是,序列化项集合包括与项关联的项映射。但是,由于实际上也发送了项映射,因此实际上我最终发送了项映射集合两次:一次是单独发送,一次是嵌入到项集合中。这意味着我的线路占用是不必要的大

我要做的是在容器类中的onserialization方法中分离实体,只在itemMapping对象上保留项ID,然后在OnDeserialized方法中,根据这些ID重新关联它们

不幸的是,在OnSerialization方法中,如果我将ItemMapping.Item属性设置为null,然后尝试将ItemID属性设置为我刚刚设置为null的项的ID,我会得到臭名昭著的ForeignKeyReferenceAlreadyHasValueException。这有点令人恼火:)


如果你把我的问题问到这一步,我已经欠你谢谢了。如果您理解我的问题并有任何建议,我将不胜感激。

在序列化过程中修改实例的属性肯定会带来麻烦

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

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
}
公共类服务响应
{
公共列表{get;set;}
公共列表映射{get;set;}
}
公共类项目
{
公共int ItemId{get;set;}
//TODO更多属性,但没有ItemMappings属性
}
公共类项映射
{
公共int ItemId{get;set;}
//待办事项更多属性
}

在序列化过程中修改实例的属性肯定会带来麻烦

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

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
}
公共类服务响应
{
公共列表{get;set;}
公共列表映射{get;set;}
}
公共类项目
{
公共int ItemId{get;set;}
//TODO更多属性,但没有ItemMappings属性
}
公共类项映射
{
公共int ItemId{get;set;}
//待办事项更多属性
}

因为这篇文章发表已经快一年了,恐怕这个问题对我来说已经无关紧要了。不过,我希望其他人能从你的回答中受益。谢谢因为这篇文章发表已经快一年了,恐怕这个问题对我来说已经不重要了。不过,我希望其他人能从你的回答中受益。谢谢