2009-04-16 114 views
2

我通过WCF序列化一个linq对象。 dbml被设置为单向序列化。使用WCF序列化linq实体

我的对象非常简单:预算具有BudgetLineItems的集合。每个BudgetLineItem都有一个ItemCateogry。

Budget/BudgetLineItems序列化正常。但是,每个BudgetLineItem上的ItemCateogry都不会。我注意到默认情况下,linq没有在每个BudgetLineItem的ItemCategory上添加一个[DataMember]。我手动添加了它,并用[IgnoreDataMember]删除了ItemCategory实体上的任何可能的循环引用。不过,不是运气。

问题:

  1. 能WCF,默认情况下,序列化多到一对一的关系,还是我只是失去了一些东西?我知道序列化数据对于每个BudgetLineItem都会有相同的重复ItemCategory数据,但这很好。

  2. 我需要为此自定义DataContractSerializer吗?

**编辑**其实,没有工作(添加[DataMember]),我只是没有更新客户端(杜)的服务引用。

新问题:有没有办法告诉linqtosql设计器在设计器生成的实体上维护这些[DataMember]和[IgnoreDataMember]字段?否则我需要每次保存dbml时更新它们。

回答

3

你是否成功地为你的LINQ 2 SQL对象序列化了WCF?

当我尝试了这个(非常不情愿,请参阅下面为什么),它真的倒了下来,我的L2S实体中有指向子女的关系,然后孩子指向父母,显然在建立WCF对象,它无法以这种方式无限遍历树,[我记得最好]导致了一个溢出异常,所以我基本上说的是要小心,如果你走这条路!

继续关注Michael的文章,我会建议将您的WCF对象转换为POCO(自定义模型表示)。我很高兴上述不起作用,因为我总是希望制作一个传输干净的数据子集的自定义WCF对象,正是WCF请求需要的,然后它不包含一堆多余的数据发送数据,我相信你的L2S实体有很多。我试图直接通过网络发送我的L2S数据的实际原因是因为我必须制作一个使用某些“规则”的引擎,这些规则存储在大约4个关系数据库表的关联中,并且不可维护一个单独的WCF对象。

所以最后我做的是扩展自定义代码gen类,使其包含[DataContext]的Wcf.cs,然后克隆属性为L2S类 - > WCF自定义类。

它的工作完美到底,这是cloning procedure I used with instructions on my blog

我对此感到满意,不觉得有不良做法涉及。希望这可以帮助。

+0

感谢您的信息。为了成功的序列化,我们必须添加一个[DataMemberIgnore]给任何递归的道具(通常是引用回父节点),因为那些将不会序列化。这涉及到更改dbml,这当然会在每次更改时被覆盖。它可以工作,但不是非常无缝。如你所知,序列化的对象是_huge_。 幸运的是,这仅仅是一个概念验证(SQLRS2008消耗WCF层给我们的服务摆脱了redudant逻辑) – ericvg 2009-04-21 16:17:40

1

你不应该用WCF发送LINQ实体。取而代之的是制作自己的业务数据模型并通过电报发送。如果你曾经改变你的数据库,你不想改变每一个与你的服务连接的程序

+0

同意,但为了这个特定项目的目的,我们正在交易。 – ericvg 2009-04-16 16:58:39