我有一个如下测试方法:
public void Add_Update_Delete_a_Registration() {
ISessionFactory sessionFactory = SessionFactory.GetSessionFactory(connString);
using (ISession session = sessionFactory.OpenSession()) {
Course course = new CourseRepository(session).GetById(12019);
Registration entity = new Registration();
entity.Course = course; //Assign the Course to register
//assign other entity members
//...
RegistrationRepository repository = new RegistrationRepository(session);
repository.Add(entity);
}
正确插入了注册实体。
问题是,NHibernate还进行了UPDATE数据库调用,以更新测试方法中根本没有更改的Course实体。可能的原因是什么?
映射:
public class CourseMap : ClassMap<Course>{
public CourseMap() {
Id(x => x.Id).GeneratedBy.HiLo("100");
Map(x => x.WeekDay)
.Not.Nullable()
.CustomType<int>(); //WeekDay is type of DayOfWeek enums
References(x => x.Room)
.Not.Nullable();
Map(x => x.StartTime)
.Not.Nullable();
Map(x => x.EndTime)
.Not.Nullable();
Map(x => x.CreatedTime)
.Not.Nullable();
Map(x => x.UpdatedTime);
Map(x => x.CreatedBy)
.Not.Nullable();
Map(x => x.UpdatedBy);
Version(x => x.Version).Column("RCB_Version")
.CustomSqlType("timestamp")
.Generated.Always()
.Not.Nullable();
}
public class RegistrationMap : ClassMap<Registration>{
public RegistrationMap() {
Id(x => x.Id)
.GeneratedBy.HiLo("100");
Map(x => x.OwnerWindowsAccount)
.Not.Nullable()
.Length(50);
References(x => x.Course)
.Not.Nullable();
Map(x => x.TrainingDate)
.Not.Nullable();
Map(x => x.RegistreeName)
.Not.Nullable()
.Length(50);
Map(x => x.RegistreeWindowsAccount)
.Nullable()
.Length(50);
Map(x => x.CreatedTime)
.Not.Nullable();
Map(x => x.UpdatedTime);
Map(x => x.CreatedBy)
.Not.Nullable();
Map(x => x.UpdatedBy);
Version(x => x.Version)
.CustomSqlType("timestamp")
.Generated.Always()
.Not.Nullable();
}
}
非常感谢! 利奥
答案 0 :(得分:1)
您指定了版本列。这意味着任何属性更改(甚至集合)都会触发版本更新。
为了防止某个属性/集合更改版本,应在xml映射中设置optimistic-lock="false"
属性。
虽然不确定它是如何用流利的语法。可能.OptimisticLock.False()或其他什么。
答案 1 :(得分:0)
有一些可能导致此问题的各种问题。当我将枚举映射错误或以错误的方式使用inverse =“true | false”时,我经常会得到它。