Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.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
C# ADO.NET实体数据模型序列化问题_C#_.net_Entity Framework_Ado.net_Asp.net Web Api2 - Fatal编程技术网

C# ADO.NET实体数据模型序列化问题

C# ADO.NET实体数据模型序列化问题,c#,.net,entity-framework,ado.net,asp.net-web-api2,C#,.net,Entity Framework,Ado.net,Asp.net Web Api2,我对这个框架非常陌生。我让VS scaffold从我现有的数据库中删除一个数据模型,而我在尝试从它的API2控制器中正确获取数据时遇到了问题 模型如下: namespace AngularWebApi.Models { using System; using System.Collections.Generic; using System.Runtime.Serialization; public partial class BlockDeveloper

我对这个框架非常陌生。我让VS scaffold从我现有的数据库中删除一个数据模型,而我在尝试从它的API2控制器中正确获取数据时遇到了问题

模型如下:

namespace AngularWebApi.Models
{
    using System;
    using System.Collections.Generic;
    using System.Runtime.Serialization;

    public partial class BlockDeveloper
    {
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage",        "CA2214:DoNotCallOverridableMethodsInConstructors")]
        public BlockDeveloper()
        {
            this.Reviews = new HashSet<Review>();
            this.Topics = new HashSet<Topic>();
        }

        public int DeveloperId { get; set; }
        public string UserName { get; set; }
        public string PassWord { get; set; }
        public string eMail { get; set; }
        int PostCount { get; set; }
        public int RespondCount { get; set; }
        public int Score { get; set; }

        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
        public virtual ICollection<Review> Reviews { get; set; }
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
        public virtual ICollection<Topic> Topics { get; set; }
    }
}
namespace AngularWebApi.Models
{
使用制度;
使用System.Collections.Generic;
使用System.Runtime.Serialization;
公共部分类BlockDeveloper
{
[System.Diagnostics.CodeAnalysis.SuppressMessage(“Microsoft.Usage”,“CA2214:DoNotCallOverridableMethodsInConstructors”)]
公共区块开发者()
{
this.Reviews=newhashset();
this.Topics=newhashset();
}
public int DeveloperId{get;set;}
公共字符串用户名{get;set;}
公共字符串密码{get;set;}
公共字符串电子邮件{get;set;}
int PostCount{get;set;}
公共int响应计数{get;set;}
公共整数分数{get;set;}
[System.Diagnostics.CodeAnalysis.SuppressMessage(“Microsoft.Usage”,“CA2227:CollectionPropertiesShouldBreadOnly”)]
公共虚拟ICollection审阅{get;set;}
[System.Diagnostics.CodeAnalysis.SuppressMessage(“Microsoft.Usage”,“CA2227:CollectionPropertiesShouldBreadOnly”)]
公共虚拟ICollection主题{get;set;}
}
}
以下是我正在尝试执行的GET:

namespace AngularWebApi.Controllers
{
    public class BlockDevelopersController : ApiController
    {
         private AngularSiteEntities4 db = new AngularSiteEntities4();

        // GET: api/BlockDevelopers
        public IQueryable<BlockDeveloper> GetBlockDevelopers()
        {
            return db.BlockDevelopers;
        }

        //....more actions...
    }
}
namespace AngularWebApi.Controllers
{
公共类BlockDeveloperController:ApicController
{
私有AngularSiteEntities4 db=新AngularSiteEntities4();
//获取:api/BlockDevelopers
公共IQueryable GetBlockDevelopers()
{
返回db.BlockDevelopers;
}
//……更多行动。。。
}
}
我一直得到以下错误:

不应键入“System.Data.Entity.DynamicProxies.BlockDeveloper_2BE89EC23AFBD5F46CBA6ED3403E8895016357CDDA3553D07BA526B43E774273”,数据合同名称为“BlockDeveloper_2BE89EC23AFBD5F46CBA6ED3403E8895016357CDDA353D07BA526B43E774273”。考虑使用DATACONTRORTCORDEVER或将未知类型的任何类型添加到已知类型的列表中——例如,使用NoNyType属性或将它们添加到传递给DATACONTROTTRORIGLASER的已知类型列表中。 我已经阅读了很多帖子和论坛,并弹出了两个关键的解决方案:使用[KnownType(typeof(T))],以及Configuration.ProxyCreationEnabled=false

我把KnownType属性扔到了代码中的所有地方,但运气不好——我完全不知道在自动生成的ADO.NET实体数据模型中该在何处执行此操作

我终于在我的BlockdeveloperController中尝试了“Configuration.ProxyCreationEnabled=false;”,并且不再出现错误。我终于可以看到我的BlockDeveloper列表了——但有一个问题,没有任何子对象(评论、主题)被呈现(序列化时它们是空标记)。我知道数据是存在的,因为如果我调试并单独循环每个BlockDeveloper的评论和主题,我就能看到它

我完全不知道如何获取我所有的数据。如果我使用的是“Configuration.ProxyCreationEnabled=false;”,是否有办法获取它?我似乎在读我不能读的书。如何使用“[KnownType(typeof(T))]”属性来更正此问题(这些属性在ADO.NET实体数据模型项目中具体位于何处?)


任何帮助都会很好,谢谢

当您尝试将模型中的虚拟属性序列化为JSON时,会导致无限循环,因为
Review
Topic
引用了
BlockDeveloper
,反之亦然。您应该使用即时加载从包含的数据库中获取
查看
主题
模型,而不是尝试延迟加载它们。

我认为序列化失败是因为模型中存在虚拟属性。当模型被序列化为JSON时,它也会尝试序列化评论和主题的集合,这些评论和主题可能引用了BlockDeveloper(可能更多?)。您必须确保序列化不会陷入无休止的循环中。我通常将实体转换为POCO类,并通过Web Api发送这些类。@AlexanderDerck-您是对的,实体模型确实引用了BlockDeveloper(以及更多),如果我理解正确的话)在序列化过程中肯定会导致循环问题。我不知道为什么他们会自动设置这种方式,如果它可能会导致这样的问题。我删除了引用,以便每个实体模型与其依赖项具有单向关系。还是有问题。。。。删除标记“virtual”会删除错误,但根本不会填充子实体。我会继续看的,谢谢你的建议!如果
Review
主题
实体不再引用
BlockDeveloper
,则应在数据库调用中使用.Include(“Review”)。应该加载的子实体blockdeveloper@AlexanderDerck-非常好的建议,这允许我通过API完全返回我的BlockDeveloper实体!因此,我必须删除在创建AngularSite模型时创建的不需要的引用(如果错误的话,我仍然不确定为什么首先创建它们),我必须将“Configuration.ProxyCreationEnabled=false;”添加到我的上下文中,最后我必须将“.Include”(“Reviews”).Include”(“Topics”)添加到我对db的调用中。多谢!如果你愿意,我会给你一些时间回答,否则我会让它成为答案,这样其他人可能会很容易找到它,再次感谢。投票,一旦我的代表到15,它将计数,谢谢!接受答案给+2我发誓我会的,对不起。