【问题标题】:Sending Entity Framework entities over WCF: how to prevent serialization of navigation fields?通过 WCF 发送实体框架实体:如何防止导航字段的序列化?
【发布时间】:2012-02-29 15:30:03
【问题描述】:

我在通过 WCF 发送具有导航属性的实体框架生成的实体时遇到问题。我有一个Securities 用于存储财务数据的数据库和其中的两个表:

Stock : Id, Symbol, CompanyName, ExchangeName
Option: Id, StockId, OptionType, Strike

我为此数据库创建了一个实体框架模型。然后我创建了 WCF 服务,它将生成的 StockOption EF 实体暴露给客户端。

我生成的实体Stock 具有导航属性EntityCollection<Option> Options。 当试图从 WCF 服务返回 Stock 实体到客户端时,我得到一个 SerializationException:WCF 无法序列化 Options 导航属性,因为数据库连接已经关闭。

我可以在打开数据库连接时调用Options.Load()方法来填充Options属性,但是如果我不想为Stock实体加载完整的对象图该怎么办?

【问题讨论】:

  • 实体不适用于您的服务层,即使它们是 Code-First POCO,EF 也会对其进行变异。为您的服务层创建单独的模型/DTO。

标签: wcf entity-framework serialization


【解决方案1】:

我已经和这个打了一段时间了。

首先,我关闭了延迟加载。但是我的对象图中的循环仍然存在问题。
然后,我将[DataContract(IsReference = true)] 标签放在我的所有实体上。那行得通,但是我仍然对非规范化数据库有很多性能问题。 最后,我分解并制作了 dto,并使用 AutoMapper 填充它们。

我的一个同事从一开始就告诉我要这样做,我应该听他的。帮自己一个忙,不要犯和我一样的错误。

编辑
我忘了提到我在反序列化具有ICollection<T> 类型属性的实体时遇到了问题。这些将反序列化为数组。 T[] 以某种方式实现了 ICollection<T>AddRemove 会抛出异常。这是使用 DTO 的另一个原因。

【讨论】:

  • 数组 ([]) 不能在 .NET 中被 Add()ed 到。它不像可以push()ed 的Javascipt 数组,所以这就是你得到错误的原因。如果是List<T>,它可能是
【解决方案2】:

使用 EF5,不确定使用 EF4,这可能有效。将导航属性设置器更改为私有。

public class OptionEntity
{
    // properties

    // navigation 
    public virtual StockEntity Stock { get; private set; }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-23
    相关资源
    最近更新 更多