У меня есть объекты Entity Framework, разделенные на отдельную библиотеку классов из моего веб-проекта и уровня доступа к данным. В моем контроллере я звоню в мой репозиторий, чтобы получить IEnumerable<RobotDog.Entities.Movie>
, а затем попытаюсь выполнить сериализацию в json с помощью JavaScriptSerializer
, но я получаю круговую ссылку, хотя я использую атрибут [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();
}
}
}