为什么NHibernate UPDATE引用实体?

时间:2011-11-30 19:42:15

标签: nhibernate

我有一个如下测试方法:

       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();
    }
}

非常感谢! 利奥

2 个答案:

答案 0 :(得分:1)

您指定了版本列。这意味着任何属性更改(甚至集合)都会触发版本更新。

为了防止某个属性/集合更改版本,应在xml映射中设置optimistic-lock="false"属性。

虽然不确定它是如何用流利的语法。可能.OptimisticLock.False()或其他什么。

答案 1 :(得分:0)

有一些可能导致此问题的各种问题。当我将枚举映射错误或以错误的方式使用inverse =“true | false”时,我经常会得到它。