Entity Frameworkエンティティを、Webプロジェクトおよびデータアクセス層とは別のクラスライブラリに分割しています。私のコントローラーでは、リポジトリを呼び出してを取得し、IEnumerable<RobotDog.Entities.Movie>
を使用してjsonにシリアル化しようとしますが、属性JavaScriptSerializer
を使用しているにもかかわらず循環参照を取得します。[ScriptIgnore]
重要:当初、私はエンティティ、データアクセス、およびWebをすべて1つのプロジェクトにまとめていましたが、循環参照なしでエンティティを正常にシリアル化することができました。別々のレイヤーを作成したとき、それは私が問題を抱え始めたときです。私はどのエンティティも変更しませんでした。
RobotDog.Entities
名前空間内のエンティティの1つの例:
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();
}
}
}