gpt4 book ai didi

wcf - EDM -> POCO -> WCF (.NET4) 但是传输集合会导致 IsReadOnly 设置为 TRUE

转载 作者:行者123 更新时间:2023-12-02 05:14:08 24 4
gpt4 key购买 nike

好吧,这听起来有点“非正统”,但是...使用 VS2010 和 Entity Framework 的新 POCO t4 模板 (Walkthrough: POCO Template for the Entity Framework),我可以生成不错的 POCO。然后我可以在 WCF 服务中使用这些 POCO(作为 DTO),基本上从 EDM 一直到客户端。有点像这些人在做什么 ( POCO with EF 4.0 and WCF 4.0 ),除了一切都是自动生成的。我知道实体和 DTO“应该”不同,但在这种情况下,我处理的是客户端和服务器,在模型中自动生成 DTO 有一些真正的优势。

我的问题是,当我传输具有关系的实体时,客户端生成的集合 (ICollection) 具有只读值集,因此我无法操纵该关系。例如,检索现有订单时,我无法将产品添加到客户端的 Products 集合中……Products 集合是只读的。

我宁愿做一堆客户端“订单编辑”,然后将更新后的订单发回,而不是进行数十次服务器往返(例如 AddProductToOrder(product))。我也不想在 Entity 和 DTO 之间有一堆 thunking。所以总的来说,这对我来说看起来不错......除了只读部分。

是否有解决方案,或者这对 SOA 来说太过分了?

最佳答案

当反序列化发生时,分配给您的 ICollection 的 FixupCollection 被重新创建为一个数组。这就是为什么您的 Products 集合是只读的。

为了修改它,您可以使用“添加服务引用”中的选项(至少在 VS2010 上存在),将集合类型更改为其他类型(Generic.List 或 Generic.Observable)。

但是,如果您使用选项来重用现有程序集中现有的类型并引用包含您的实体的程序集,则先前的选项将不会应用于现有类型并且您的 Products 集合中仍将有 Array。

我使用的解决方法(仅当您在客户端重用类型并引用您的实体程序集时)是修改 T4 模板以检查产品获取中的集合是否为只读,如果是则设置 FixupCollection :

if (<#=code.FieldName(navProperty)#>.IsReadOnly)
{
var newCollection = new FixupCollection<<#=code.Escape(navProperty.ToEndMember.GetEntityType())#>>(<#=code.FieldName(navProperty)#>);
newCollection.CollectionChanged += Fixup<#=navProperty.Name#>;
<#=code.FieldName(navProperty)#> = newCollection;
}

关于wcf - EDM -> POCO -> WCF (.NET4) 但是传输集合会导致 IsReadOnly 设置为 TRUE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2479143/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com