【发布时间】:2013-01-28 19:02:37
【问题描述】:
我将我的实体框架实体从我的 Web 项目和数据访问层拆分为一个单独的类库。在我的控制器中,我调用我的存储库以获取IEnumerable<RobotDog.Entities.Movie>,然后尝试使用JavaScriptSerializer 序列化为json,但即使我使用的是[ScriptIgnore] 属性,我也会得到循环引用。
重要提示:最初我在一个项目中拥有我的实体、数据访问和网络,并且我能够在没有循环引用的情况下成功序列化我的实体。当我创建单独的图层时,我开始遇到问题。我没有更改任何实体。
RobotDog.Entities 命名空间中我的一个实体的示例:
namespace RobotDog.Entities {
public class Character {
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[MaxLength(200)]
public string Name { get; set; }
public virtual Person Person { get; set; }
[ScriptIgnore]
public virtual Movie Movie { get; set; }
}
}
我的控制器:
namespace RobotDog.Web.Controllers {
public class MoviesController : Controller {
private UnitOfWork _unitOfWork = new UnitOfWork();
[HttpGet]
public ActionResult Index() {
var user = Membership.GetUser(User.Identity.Name);
if(user != null) {
var movies = _unitOfWork.UserMovieRepository.Get(u => u.UserId == (Guid) user.ProviderUserKey).Select(m => m.Movie);
var serializer = new JavaScriptSerializer();
var json = serializer.Serialize(movies);
return View(json);
}
return View();
}
}
}
我的仓库:
namespace RobotDog.DataAccess.Movies {
public class Repository<TEntity> : IRepository<TEntity> where TEntity : class {
internal MovieContext Context;
internal DbSet<TEntity> DbSet;
public Repository(MovieContext context) {
if (context == null)
throw new ArgumentNullException("context");
Context = context;
DbSet = Context.Set<TEntity>();
}
public virtual IEnumerable<TEntity> Get(Expression<Func<TEntity, bool>> predicate = null, Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null ) {
IQueryable<TEntity> query = DbSet;
if (predicate != null)
query = query.Where(predicate);
return orderBy != null ? orderBy(query).ToList() : query.ToList();
}
}
}
【问题讨论】:
-
大多数人在那时切换到 JSON.net。另一种方法是通过覆盖允许循环引用的部分来编写自己的 javascriptserializer 实现。
-
是的,我查看了
JsonConvert,但我不喜欢在它应该工作时必须编写更多代码的想法,并且最初在我分成多个项目之前工作,只是装饰一个属性与[ScriptIgnore]。我还研究了创建一个 viewModel,然后使用 AutoMapper 映射这两种类型。但我就是无法绕开必须编写更多代码来完成没有代码就应该完成的事情。另外,无法弄清楚为什么这不起作用让我发疯:)
标签: asp.net-mvc entity-framework circular-reference javascriptserializer