在实体框架4.0中反序列化问题

时间:2012-02-14 06:54:41

标签: c# wcf entity-framework-4

我正在使用Entity Framework 4.0开发一个应用程序。和WCF。

我正在返回对象列表(员工)

该对象的导航属性是(部门)

和部门还有一个导航财产(分支机构)

我将所有内容都包括在内

Employees.include("Departments.Branch");

现在发布所有那些Branch相同的部门,在WCF上反序列化时设置为null(第一个除外)。

我需要将分支用于某些绑定目的,请指导我如何摆脱这个问题。

这是实体enter image description here

的屏幕截图

6 个答案:

答案 0 :(得分:3)

可能是在序列化之前没有加载数据,但是当您在服务器端进行调试时,延迟加载会导致数据被加载。

你可以尝试一些事情。

这将强制查询运行:

Employees.include("Departments.Branch").ToList();

这将显式加载实体:

context.Entry(Employees).Reference(u => u.Departments.Branch).Load();

答案 1 :(得分:0)

您可以尝试使用Entity Framework Profiler并查看生成的查询是否具有有效数据。 http://efprof.com/

答案 2 :(得分:0)

来自MSDN

  

Windows Communication Foundation(WCF)无法直接序列化或反序列化代理,因为DataContractSerializer只能序列化和反序列化已知类型,而代理类型不是已知类型。当您需要序列化POCO实体时,请禁用代理创建或使用ProxyDataContractResolver类将代理对象序列化为原始POCO实体。要禁用代理创建,请将ProxyCreationEnabled属性设置为false。

除此之外,请检查您是否使用Interoperable Object References?我也会试试。按照here说明进行设置

答案 3 :(得分:0)

在POCO类+枚举和结构(所有序列化的结构)上,必须具有IsReference = true的DataContract属性:

[DataContract(Name = "Employee", Namespace = "http://MyNamespace", IsReference=true)]
class Employee
{
    [DataMember(Name="Branch")]
    public Branch _branch = new Branch();
            ... or ...
    [DataMember(Name="Branches")]
    public List<Branch> _branches = new List<Branch>();
}

[DataContract(Name = "Branch", Namespace = "http://MyNamespace", IsReference=true)]
class Branch { ... }

IsReference = true确保在序列化期间将所有指针转换为引用。还要确保您的引用具有DataMember属性。

答案 4 :(得分:0)

在POCO-Classes上使用[DataContract]作为类,[DataMember]用于属性,例如 Bahri Gungor 。此外,您可以编写一些方法,这些方法将由Serializer调用。查看MSDN:OnDeserialized OnDeserializingOnSerializedOnSerializing

在WCF服务中,您需要使用Attribute来声明要返回EF-Proxy-Class的位置。

[ApplyDataContractResolver]
public POCO_CLASS GetById(int id){
    // your code here...
}

ApplyDataContractResolver看起来像:

public class ApplyDataContractResolverAttribute : Attribute, IOperationBehavior {
    public ApplyDataContractResolverAttribute() {
    }

    public void AddBindingParameters(OperationDescription description, BindingParameterCollection parameters) {
    }

    public void ApplyClientBehavior(OperationDescription description, System.ServiceModel.Dispatcher.ClientOperation proxy) {
        var dataContractSerializerOperationBehavior = description.Behaviors.Find<DataContractSerializerOperationBehavior>();
        dataContractSerializerOperationBehavior.DataContractResolver = new ProxyDataContractResolver();
    }

    public void ApplyDispatchBehavior(OperationDescription description, System.ServiceModel.Dispatcher.DispatchOperation dispatch) {
        var dataContractSerializerOperationBehavior = description.Behaviors.Find<DataContractSerializerOperationBehavior>();
        dataContractSerializerOperationBehavior.DataContractResolver = new ProxyDataContractResolver();
    }

    public void Validate(OperationDescription description) {
        // Do validation.
    }
}

背景是带有DataContractSerializer的WCF序列化和EF构建代理类来跟踪更改。

此处指向ProxyDataContractResolverMSDN

的MSDN链接

答案 5 :(得分:0)

尝试在查询中使用.Include()来加载相关对象和元数据中的[Include]属性,以允许将这些相关对象序列化并发送到客户端。

本期(或至少类似)讨论here