Учитывая это:
namespace TheEntities
{
[DataContract(IsReference=true)]
public class Question
{
[DataMember] public virtual int QuestionId { get; set; }
[DataMember] public virtual string Text { get; set; }
[DataMember] public virtual string Poster { get; set; }
[DataMember] public virtual IList<QuestionComment> Comments { get; set; }
[DataMember] public virtual IList<Answer> Answers{ get; set; }
[DataMember] public virtual byte[] RowVersion { get; set; }
}
[DataContract]
public class QuestionComment
{
[DataMember] public virtual Question Question { get; set; }
[DataMember] public virtual int QuestionCommentId { get; set; }
[DataMember] public virtual string Text { get; set; }
[DataMember] public virtual string Poster { get; set; }
}
[DataContract(IsReference = true)]
public class Answer
{
[DataMember] public virtual Question Question { get; set; }
[DataMember] public virtual int AnswerId { get; set; }
[DataMember] public virtual string Text { get; set; }
[DataMember] public virtual string Poster { get; set; }
[DataMember] public virtual IList<AnswerComment> Comments { get; set; }
}
[DataContract]
public class AnswerComment
{
[DataMember] public virtual Answer Answer { get; set; }
[DataMember] public virtual int AnswerCommentId { get; set; }
[DataMember] public virtual string Text { get; set; }
[DataMember] public virtual string Poster { get; set; }
}
}
Entity Framework не создавал дубликаты объектов для ответа, вопроса, ответа, ответа, в то время как NHibernate делает.
public Question OpenQuestion(int id)
{
var repo = QuestionRepository;
var query = repo.All.Where(y => y.QuestionId == id);
if (QuestionRepository.GetType() == typeof(EfRepository<Question>))
{
query = query
.Include("Answers")
.Include("Answers.Comments")
.Include("Comments");
return query.Single();
}
else if (QuestionRepository.GetType() == typeof(NhRepository<Question>))
{
// kinda sad, produces duplicate objects
query = query
.FetchMany(x => x.Answers)
.ThenFetchMany(x => x.Comments)
.FetchMany(x => x.Comments);
}
else
throw new Exception("Something unsupported");
return query.Single();
}
Это также создает дубликаты объектов (три уровня глубиной, используя три отношения):
query = query
.FetchMany(x => x.Answers)
.ThenFetchMany(x => x.Comments)
При этом также создаются дубликаты объектов (только на два уровня глубиной, но с использованием трех отношений):
query = query
.FetchMany(x => x.Answers)
.FetchMany(x => x.Comments);
Это не приводит к дублированию объектов, однако энергичная загрузка предназначена только для двух уровней и двух отношений, то есть от вопроса к ответу. Для комментариев к вопросу и комментариев для ответа они выполняются по отдельному запросу.
query = query
.FetchMany(x => x.Answers);
Если NHibernate может хорошо выполнять свою работу только для двух уровней FetchMany только с двумя отношениями, зачем беспокоиться о создании ThenFetchMany (используется на трех уровнях, но имеет ошибку, содержит дубликаты объектов)? На самом деле, даже FetchMany также бесполезен, если вы хотите использовать его и для трех отношений, он также создает дубликаты объектов.
Может ли команда NHibernate позаботиться об удалении ThenFetchMany, поскольку она не может работать должным образом?
Там нет ошибки в моем отображении, все работает правильно (то есть не создает дубликаты объектов), когда я удалил стратегии извлечения.