我正在使用Entity Framework 4.0开发一个应用程序。和WCF。
我正在返回对象列表(员工)
该对象的导航属性是(部门)
和部门还有一个导航财产(分支机构)
我将所有内容都包括在内
Employees.include("Departments.Branch");
现在发布所有那些Branch相同的部门,在WCF上反序列化时设置为null(第一个除外)。
我需要将分支用于某些绑定目的,请指导我如何摆脱这个问题。
这是实体
的屏幕截图答案 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 OnDeserializing,OnSerialized和OnSerializing
在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构建代理类来跟踪更改。
此处指向ProxyDataContractResolver
:MSDN
答案 5 :(得分:0)
尝试在查询中使用.Include()
来加载相关对象和元数据中的[Include]
属性,以允许将这些相关对象序列化并发送到客户端。
本期(或至少类似)讨论here