问题描述
因此,继承人的处理我有
so heres the deal i have
模式
public class News
{
public News()
{
this.Created = DateTime.Now;
}
public int Id { get; set; }
public string Title { get; set; }
public string Preamble { get; set; }
public string Body { get; set; }
public DateTime Created { get; set; }
public int UserId { get; set; }
public virtual User User { get; set; }
public int CategoryId { get; set; }
public int ImageId { get; set; }
public virtual Image Image { get; set; }
public virtual Category Category { get; set; }
}
public class Image
{
public int Id { get; set; }
public string Name { get; set; }
public string ImageUrl { get; set; }
public Byte[] ImageData { get; set; }
public string ImageMimeType { get; set; }
}
public class Category
{
public int Id { get; set; }
public string Name { get; set; }
}
....以下型号连接到下面的仓库(这些车型都连接到EfDbContext)...
....following models(these models are connected to the EfDbContext) connected to following repository...
接口/库
public class NewsRepository : INewsRepository
{
EfDbContext context = new EfDbContext();
public IQueryable<News> All
{
get { return context.News; }
}
public IQueryable<News> AllIncluding(params Expression<Func<News, object>>[] includeProperties)
{
IQueryable<News> query = context.News;
foreach (var includeProperty in includeProperties) {
query = query.Include(includeProperty);
}
return query;
}
public News Find(int id)
{
return context.News.Find(id);
}
public void InsertOrUpdate(News news)
{
if (news.Id == default(int)) {
// New entity
context.News.Add(news);
} else {
// Existing entity
context.Entry(news).State = EntityState.Modified;
}
}
public void Delete(int id)
{
var news = context.News.Find(id);
context.News.Remove(news);
}
public void Save()
{
context.SaveChanges();
}
}
public interface INewsRepository
{
IQueryable<News> All { get; }
IQueryable<News> AllIncluding(params Expression<Func<News, object>>[] includeProperties);
News Find(int id);
void InsertOrUpdate(News news);
void Delete(int id);
void Save();
}
在我的HomeController()我得到了一个JsonResult梅托德,我要返回的上下文。
这里是法
In my HomeController() i got a a JsonResult metod that i want to return the context.Here is the Method
JSON请求
[HttpGet]
public JsonResult GetNews()
{
var p = newsRepository.AllIncluding(news => news.Category, news => news.Image);
return Json(p, JsonRequestBehavior.AllowGet);
}
我收到以下错误:
I get the following error:
在序列化类型的对象时检测到循环引用'System.Data.Entity.DynamicProxies.News_96C0B16EC4AC46070505EEC7537EF3C68EE6CE5FC3C7D8EBB793B2CF9BD391B3'.
我猜这事做的惰性加载的东西(IAM目前学习C#)我发现这篇文章这个...
I guessed that this has something to do with the lazyloading stuff(Iam currently learning about C#) i found this article about this...
http://hellowebapps.com/2010-09-26/producing-json-from-entity-framework-4-0-generated-classes/
但我没有得到它的工作...我可以阅读有关code的,他们试着深度搜索槽的对象......不止这些我无法弄清楚。
but i didnt get it to work... what i could read about the code was that they were tryin to depth search trough the object... more than that i couldn't figure out.
我的问题是如何,我可以在惰性加载的对象传递?成JSON /串行
或者它不存在,怎么我可以进行什么想法?
my question is how to i can pass in lazyLoading objects? into json/serializeror does it not exist, any thoughts of how i can proceed?
推荐答案
由于JSON是基于树的序列化格式,它具有像A-> B-> A引用的问题。结果
我读过的地方,你可以使用ScriptIgnore在你的ViewModels归因于prevent此错误。但没有测试过。
Since Json is a tree-based serialization format, it has problems with references like A->B->A.
I've read somewhere that you can use ScriptIgnore attribute in your viewmodels to prevent this error. But have not tested it.
您可以更改code以下(使用匿名类型)成功地检索项目:
You can change your code to the following (use anonymous types) to retrieve the items successfully:
var p = newsRepository.AllIncluding(news => news.Category, news => news.Image)
.Select(n => new {id = n.Id, Body = n.Body});
包含要在最后一个选择
方法来显示所有的其他财产。这使得您的JSON结果更为轻巧了。
Include any other property you wish to display in the last Select
method. This makes your Json results more lightweight too.
这篇关于的EntityFramework到JSON解决方法吗? (而序列化类型的对象时检测到循环引用... DynamicProxies)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!