【发布时间】:2014-10-05 12:27:53
【问题描述】:
我正在尝试通过NHibernate 测试一个简单的对象编辑,但我得到了一些奇怪的结果。
我将此类映射标记对象作为树:
public class Tag
{
public int Id { get; set; }
public int Description { get; set; }
private IList<Tag> childTag = new List<Tag>();
public virtual IEnumerable<Tag> ChildTag
{ get { return childTag.ToArray(); } }
public virtual void Add(Tag child)
{ childTag .Add(child); }
public virtual bool Remove(Tag child)
{ return childTag .Remove(child); }
}
有了这张地图:
public TagMap()
{
Id(x => x.Id)
.Column("Kint_T01_IdTag")
.GeneratedBy.Assigned();
HasMany(x => x.ChildTag)
.KeyColumn("ParentId")
.Cascade.All()
.Access.CamelCaseField().ReadOnly();
}
做一个简单的测试:
using (IUnitOfWork uow = new UnitOfWork())
{
uow.Start();
uow.TagRepository.Create(Tag);
uow.Commit();
uow.End();
// Act
Tag.remove(Tag.Children.First());
uow.Start();
uow.TagRepository.Update(Tag);
uow.Commit();
uow.End();
uow.Start();
TagActual = uow.TagRepository.GetById(Tag.Id);
//Assert
TagActual.ShouldBeEquivalentTo(Tag);
uow.End();
}
我收到此错误:
NHibernate.HibernateException : changed an immutable collection instance: [Gedi.Domain.Object.Entity.Tag.Children#21]
虽然我在单个会话中运行测试(在操作之间没有关闭会话),但一切顺利并且没有引发异常(除了NHibernate 没有按照我报告的那样更新表格@ 987654321@)
需要有关此问题的一些指导以及解决此问题的步骤。
谢谢。
编辑
这是行之有效的方式
using (IUnitOfWork uow = new UnitOfWork())
{
uow.Start();
uow.TagRepository.Create(Tag);
uow.Commit();
Tag.Remove(Tag.Children.First());
uow.TagRepository.Update(Tag);
uow.Commit();
uow.End();
uow.Start();
TagActual = uow.TagRepository.GetById(Tag.Id);
TagActual.ShouldBeEquivalentTo(Tag);
uow.End();
}
但我认为在业务代码中我可能有必要在会话之外工作,所以我想让它在任何情况下运行。
我编辑了一些方法名称,因为我不会在数据访问层之外公开会话和会话概念,因为会话是特定于 NHibernate 的
编辑 2:
这也很好用:
using (IUnitOfWork uow = new UnitOfWork())
{
uow.Start();
uow.TagRepository.Create(Tag);
uow.Commit();
uow.End();
// Act
Tag.Description = "EDITED";
uow.Start();
uow.TagRepository.Update(Tag);
uow.Commit();
uow.End();
uow.Start();
TagActual = uow.TagRepository.GetById(Tag.Id);
//Assert
TagActual.ShouldBeEquivalentTo(Tag);
uow.End();
}
只有集合在会话之外给出错误
【问题讨论】:
标签: c# unit-testing session nhibernate