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

时间:2015-11-23 02:40:55

标签: c# .net entity-framework ado.net asp.net-web-api2

我对这个框架很新。我让VS支持我现有数据库的数据模型,我在尝试从其API 2控制器正确获取数据时遇到问题。

以下是模型:

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; }
    }
}

以下是我正在尝试的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...
    }
}

我一直收到以下错误:

  

不要求输入'System.Data.Entity.DynamicProxies.BlockDeveloper_2BE89EC23AFBD5F46CBA6ED3403E8895016357CD4A3553D07BA526B43E774273'与数据合约名称'BlockDeveloper_2BE89EC23AFBD5F46CBA6ED3403E8895016357CD4A3553D07BA526B43E774273:http://schemas.datacontract.org/2004/07/System.Data.Entity.DynamicProxies'。考虑使用DataContractResolver或将任何静态未知的类型添加到已知类型列表中 - 例如,使用KnownTypeAttribute属性或将它们添加到传递给DataContractSerializer的已知类型列表中。

我已阅读了不少帖子和论坛,并弹出了两个关键解决方案:使用[KnownType(typeof(T))]和Configuration.ProxyCreationEnabled = false;。

我已经在我的代码中抛出了KnownType属性而没有运气 - 我完全不知道在自动生成的ADO.NET实体数据模型中该做什么。

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

我很遗憾如何获取所有数据。如果我使用“Configuration.ProxyCreationEnabled = false;”,有没有办法获得它?我似乎在读,我不能。如何使用“[KnownType(typeof(T))]”属性来纠正这个问题(这些属性在ADO.NET实体数据模型项目中是否完全正确?)。

任何帮助都会很棒,谢谢!

1 个答案:

答案 0 :(得分:2)

当您尝试将它们序列化为JSON时,模型中的虚拟属性会导致无限循环,因为$.getJSON('http://xeuroasiantvx.api.channel.livestream.com/2.0/listplaylists.json?callback=listplaylists').then(function(data) { alert('Your Json result is: ' + data.result); //you can comment this, i used it to debug result.innerText = data.result; //display the result in an HTML element }, function(status) { //error detection.... alert('Something went wrong.'); }); Review引用了Topic,反之亦然。您应该使用预先加载来使用include从数据库中获取BlockDeveloperReview模型,而不是尝试延迟加载它们。