我对这个框架很新。我让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实体数据模型项目中是否完全正确?)。
任何帮助都会很棒,谢谢!
答案 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从数据库中获取BlockDeveloper
和Review
模型,而不是尝试延迟加载它们。