我有一个名为Folder的自引用模型,还有一个名为Content的实体,它包含文件夹实体。
public class Folder : BaseEntity
{
public int Id { get; set; }
public string Name { get; set; }
public int? ParentId { get; set; }
public virtual Folder Parent { get; set; }
public virtual ICollection<Folder> Children { get; set; }
}
public class Content : BaseEntity
{
[Key]
public int Id { get; set; }
public string Title { get; set; }
public string HTML { get; set; }
public string Summary { get; set; }
public int XmlConfigId { get; set; }
public int FolderId { get; set; }
public virtual Folder Folder { get; set; }
}
这是我的应用程序Db上下文
public class ApplicationDbContext: DbContext
{
public DbSet<Folder> Folders { get; set; }
public DbSet<Content> Contents { get; set; }
public ApplicationDbContext() : base("ProjectDB") {
Database.SetInitializer<ApplicationDbContext>(null);
}
}
如果我使用剃刀视图显示数据,并且我能够访问内容实体内的文件夹属性,一切正常。
问题是当我尝试使用Web API显示数据时。
我的网络API
public class ContentApiController : ApiController
{
[HttpGet]
public IEnumerable<Content> GetAllContents()
{
return _unitofwork.Contents.GetAllContents();
}
}
在Web API上,GetAllContents()函数只返回直接来自文件夹DBSet的实体模型。它没有调用ToList()函数,因为我想做延迟加载。以下是GetAllContents()函数的代码。
public IEnumerable<Content> GetAllContents()
{
return ApplicationDbContext.Contents.Include(c=>c.Folder);
}
所以为了使这个工作,我必须添加。
Configuration.LazyLoadingEnabled = false;
到我的applicationDbContext构造函数,我真的不想要。 还有
Global.asax中
GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);
WebApiConfig
JsonMediaTypeFormatter jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().Single();
jsonFormatter.UseDataContractJsonSerializer = false;
jsonFormatter.SerializerSettings.Formatting = Newtonsoft.Json.Formatting.Indented;
jsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
jsonFormatter.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.None;
有没有办法在不关闭延迟加载的情况下公开json数据。感谢。
答案 0 :(得分:0)
只需在您的查询上致电ToList
,或者更好的是ToListAsync
:
[HttpGet]
public async Task<IEnumerable<Content>> GetAllContents()
{
return await _unitofwork.Contents.GetAllContents().ToListAsync;
}
即使您启用了LazyLoading,也无法避免在将数据返回到客户端之前实现数据(并让Serializer能够正常工作)。
在你的MVC示例中,框架本身在您的视图中枚举结果(我猜),因此您不是直接调用ToList
,但在您的方案中,您必须实现你的实体明确。
请注意,在控制器中调用ToList
/ ToListAsync
时没有性能问题。