C# 实体框架4.0中的反序列化问题

C# 实体框架4.0中的反序列化问题,c#,wcf,entity-framework-4,C#,Wcf,Entity Framework 4,我正在使用EntityFramework4.0开发一个应用程序。和WCF 我正在返回对象列表,例如(员工) 该对象的导航属性是(部门) 该部还设有一个航行财产(分公司) 我把一切都包括在内 Employees.include("Departments.Branch"); 现在,分支相同的所有部门在WCF上反序列化时都设置为null(第一个部门除外) 我需要将分支用于一些绑定目的,请指导我如何解决此问题 这是实体的屏幕截图您可以尝试使用实体框架探查器,查看生成的查询是否包含有效数据 来自 Wi

我正在使用EntityFramework4.0开发一个应用程序。和WCF

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

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

该部还设有一个航行财产(分公司)

我把一切都包括在内

Employees.include("Departments.Branch");
现在,分支相同的所有部门在WCF上反序列化时都设置为null(第一个部门除外)

我需要将分支用于一些绑定目的,请指导我如何解决此问题


这是实体的屏幕截图

您可以尝试使用实体框架探查器,查看生成的查询是否包含有效数据

来自

Windows通信基础(WCF)不能直接序列化或反序列化代理,因为DATACONTROTSCORLALTIZER只能序列化和反序列化已知类型,并且代理类型不是已知类型。当需要序列化POCO实体时,请禁用代理创建或使用ProxyDataContractResolver类将代理对象序列化为原始POCO实体。要禁用代理创建,请将ProxyCreationEnabled属性设置为false


除此之外,检查您是否正在使用?我也会试试。按照有关如何在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 { ... }
[DataContract(Name=“Employee”,命名空间=”http://MyNamespace“,IsReference=true)]
班级员工
{
[DataMember(Name=“Branch”)]
公共分支机构_Branch=新分支机构();
或
[DataMember(Name=“Branchs”)]
公共列表_分支=新列表();
}
[DataContract(Name=“Branch”,命名空间=”http://MyNamespace“,IsReference=true)]
类分支{…}

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

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

有几件事你可以试试

这将强制运行查询:

Employees.include("Departments.Branch").ToList();
这将显式加载实体:

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

如Bahri Gungor所说,在POCO类中,类使用
[DataContract]
,属性使用
[DataMember]
。此外,您还可以编写一些方法,这些方法将由序列化程序调用。检查MSDN中的:,和

在WCF服务中,您需要使用一个属性来声明要返回EF代理类的位置

[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.
    }
}
公共类ApplyDataContractResolverAttribute:属性,IOOperationBehavior{
公共应用程序数据契约ResolveRattribute(){
}
public void AddBindingParameters(操作说明、BindingParameterCollection参数){
}
public void ApplyClientBehavior(操作描述,System.ServiceModel.Dispatcher.ClientOperation代理){
var dataContractSerializerOperationBehavior=description.Behaviors.Find();
DataContractSerializePropertyBehavior.DataContractResolver=新的ProxyDataContractResolver();
}
public void ApplyDispatchBehavior(操作描述,System.ServiceModel.Dispatcher.DispatchOperation dispatch){
var dataContractSerializerOperationBehavior=description.Behaviors.Find();
DataContractSerializePropertyBehavior.DataContractResolver=新的ProxyDataContractResolver();
}
公共无效验证(操作说明){
//进行验证。
}
}
背景是WCF使用
DataContractSerializer
序列化,EF构建代理类来跟踪更改


这里有一个指向MSDN的链接,用于
ProxyDataContractResolver

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


讨论了这个问题(或至少类似问题)

您是否使用自跟踪实体?不,这些是正常的POCO实体如果您在服务器端对其进行配置,输出结果会是什么?它的值是否正确?是的,在服务器端,这正好显示了我的期望值。您如何返回这些实体?如果您在反序列化之前尝试访问它们,您会发现它们工作正常吗?这只会在反序列化时发生,所以探查器无法为我做任何事情。好的。然后尝试用给定的名称和属性定义数据成员的顺序,因为您有反序列化问题。我在查询中使用include,并使用ToList()显式执行事件,但这没有帮助。我有一个非常大的应用程序,它在WCF和EF中工作得非常好,我使用的是[DataContract]属性在我的PoCo类上。所有其他事情都很好,这是我遇到这个问题的唯一例外情况。这两个属性都实现了,DataContract和DataMember,涉及数百个poco类,都很好,这是我遇到这个问题的唯一地方。只是确认一下,DataContract正在使用IsReference=true?是的,这两个属性都在我的类[Serializable][DataContract(IsReference=true)]上,可能这太简单了,但是您是否在序列化之前查看了Employees.include(“Departments.Branch”)的结果并验证了所有指针都已就位?是的,我已经对它进行了多次验证,在序列化之前,它拥有所有数据,但之后类似的分支对象被设置为null