Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有实体框架代码优先关系的WCF_Wcf_Entity Framework - Fatal编程技术网

具有实体框架代码优先关系的WCF

具有实体框架代码优先关系的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; }

我正在学习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 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;