У меня есть два класса, WallPost
и Vote
. WallPost содержит отношение 1: n с голосованием. Классы автоматизированы в NHibernate.
Хорошо, теперь я запускаю тесты и заметил, что могу сохранить их обоих в БД, но когда я сбрасываю сеанс и получаю их, коллекция голосов в WallPost пуста, она не отражает БД и оно должно быть инициализировано.
Вот тест, который я запускаю, где я получаю сообщение об ошибке:
//Creating a wallpost
WallPost post = new WallPost();
post.Author = memberTwo;
post.Receiver = memberOne;
post.BodyText = "a";
//Creating the Vote
var vote = new Vote();
vote.IsUpvote = true;
vote.Member = memberOne;
//Here is where I make the connection between the two
vote.Post = post;
post.Votes.Add(vote);
//I'm saving both because I really don't know which one to save,
//kinda confused about the whole inverse thing.
provider.SaveVote(vote);
provider.SavePost(post);
//And finally evicting the vars from the ISession
FlushSessionAndEvict(vote);
FlushSessionAndEvict(post);
//Works
Assert.IsTrue(new VoteRepository().GetAll()[0] != null);
//Worls
Assert.IsTrue(new VoteRepository().GetAll()[0].Post!= null);
//FAILS ON THIS ASSERT!!!!
Assert.IsTrue(new PostRepository().GetAll()[0].Votes.Count > 0);
По какой-то причине Wallpost не инициализирует сбор голосов.
Сохранение просто открывает транзакцию, вызывает SaveOrUpdate и затем закрывает транзакцию.
Когда я закрываю транзакцию, я вижу, что вся информация сохраняется в базе данных с правильными внешними ключами и т. Д. Она просто не получается правильно.
Вот мой класс WallPost:
[Serializable]
public class WallPost : Post<WallPost>
{
}
[Serializable]
public abstract class Post<T> : Post, IHierarchy<T> where T: Post
{
public Post()
{
Children = new List<T>();
}
public virtual T Parent {
get;
set;
}
public virtual int Depth
{
get;
set;
}
public virtual IList<T> Children
{
get;
set;
}
}
[Serializable]
public abstract class Post : Entity
{
public Post()
{
CreateDate = DateTime.Now;
Votes = new List<Vote>();
}
public virtual string Name
{
get; set;
}
public virtual string BodyText
{
get; set;
}
public virtual Member Author
{
get; set;
}
public virtual Member Receiver
{
get;
set;
}
public virtual DateTime CreateDate
{
get; set;
}
[Cascade(Enums.CascadeOptions.SaveUpdate)]
public virtual IList<Vote> Votes
{
get;set;
}
}
А вот мой класс для голосования:
[Serializable]
public class Vote : Entity
{
public virtual Member Member
{
get; set;
}
[Cascade(Enums.CascadeOptions.None)]
public virtual WallPost Post
{
get;
set;
}
public virtual bool IsUpvote
{
get; set;
}
}
Я могу добавить больше кода по запросу, похоже, я все равно слишком много положил.
Спасибо.
E
РЕДАКТИРОВАТЬ: я заметил, что карты xml не отображали голоса в классе обоев. Я добавил оверид на WallPost:
mapping.HasMany (m => m.Vote) .ForeignKeyConstraintName ("WallPost_id"). LazyLoad (). Not.Inverse ();
и это работает.
Почему автоматическое сопоставление классов правильно?