具有实体框架代码优先关系的WCF
我正在学习WCF,并尝试制作一个公开项目及其任务的小型服务(标准实体框架hello world) 班级结构如下:具有实体框架代码优先关系的WCF,wcf,entity-framework,Wcf,Entity Framework,我正在学习WCF,并尝试制作一个公开项目及其任务的小型服务(标准实体框架hello world) 班级结构如下: public class Project { public int ProjectId { get; set; } public string Name { get; set; } public string Description { get; set; } public DateTime CreationDate { get; set; }
public class Project
{
public int ProjectId { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public DateTime CreationDate { get; set; }
public virtual ICollection<Task> Tasks { get; set; }
}
public class Task
{
public int TaskId { get; set; }
public string Title { get; set; }
public virtual Project RelatedProject { get; set; }
}
公共类项目
{
公共int ProjectId{get;set;}
公共字符串名称{get;set;}
公共字符串说明{get;set;}
公共日期时间创建日期{get;set;}
公共虚拟ICollection任务{get;set;}
}
公开课任务
{
public int TaskId{get;set;}
公共字符串标题{get;set;}
公共虚拟项目RelatedProject{get;set;}
}
DB上下文位于以下位置之后:
public class ProjectContext : DbContext
{
public DbSet<Project> Projects { get; set; }
public DbSet<Task> Tasks { get; set; }
}
公共类ProjectContext:DbContext
{
公共数据库集项目{get;set;}
公共数据库集任务{get;set;}
}
最后,服务端点:
public IEnumerable<Project> getProjects()
{
ProjectContext p = new ProjectContext();
return p.Projects.AsEnumerable();
}
public IEnumerable getProjects()
{
ProjectContext p=新的ProjectContext();
返回p.Projects.AsEnumerable();
}
问题是,此模型将抛出System.ServiceModel.CommunicationException,但是,如果我从模型中删除虚拟属性,它将正常工作,但我会丢失项目和任务之间的实体框架链接
任何具有类似设置的人?要通过WCF发送数据,应禁用延迟加载(
dataContext.ContextOptions.LazyLoadingEnabled=false;
)
为了确保加载了所需的数据,您需要使用即时加载(通过Include方法)
您需要将功能更改为:
public IEnumerable<Project> getProjects()
{
ProjectContext p = new ProjectContext();
p.ContextOptions.LazyLoadingEnabled = false;
return p.Projects.Include("Tasks").AsEnumerable();
}
public IEnumerable getProjects()
{
ProjectContext p=新的ProjectContext();
p、 ContextOptions.LazyLoadingEnabled=false;
返回p.Projects.Include(“任务”).AsEnumerable();
}
我的头撞在墙上好几个小时了。经过广泛的调试,谷歌给出了答案,我觉得把它贴在这里是正确的,因为这是我在谷歌得到的第一个结果
在[ServiceContract]
接口声明(通常为IProjectService.cs
public class ApplyDataContractResolverAttribute : Attribute, IOperationBehavior
{
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.
}
}
然后在[OperationContract]
关键字下添加[ApplyDataContractResolver]
关键字,即可设置
非常感谢如果包含
任务
?返回p.Projects.include(p=>p.Tasks).AsEnumerable();
这甚至不会编译,但我明白了这个想法,我会遵循这个选项;)嗯,没有尝试过(显然),但在上发现:\No luck,仍然收到此错误:服务器没有提供有意义的回复;这可能是由于契约不匹配、会话过早关闭或内部服务器错误造成的。
using System.ServiceModel.Description;
using System.Data.Objects;
using System.ServiceModel.Channels;