C# 会话.锁和具有版本属性的抽象基类的NHibernate问题

C# 会话.锁和具有版本属性的抽象基类的NHibernate问题,c#,nhibernate,C#,Nhibernate,当Version属性位于抽象基类上时,我在使用NHibernate(和Fluent NHibernate)和尝试使用session.Lock功能时遇到问题 我已经能够将一个示例简化为以下域模型: public abstract class AbstractBaseClass : Entity { public virtual int Version { get; protected set; } public virtual string Name { get; set; } }

当Version属性位于抽象基类上时,我在使用NHibernate(和Fluent NHibernate)和尝试使用session.Lock功能时遇到问题

我已经能够将一个示例简化为以下域模型:

public abstract class AbstractBaseClass : Entity
{
    public virtual int Version { get; protected set; }
    public virtual string Name { get; set; }
}

public class ChildOne : AbstractBaseClass
{
    public virtual string Address { get; set; }
}
我的配置是:

 fluentConfiguration.Mappings(map => map.AutoMappings.Add(
                AutoMap.AssemblyOf<AbstractBaseClass>()
                    .Where(x => x.IsSubclassOf(typeof(Entity)))
                    .IncludeBase<AbstractBaseClass>()
                    .Conventions.Add(DefaultCascade.All())));
它似乎试图更新基类的表,但实际上是从子表中使用forign键列名,而不是基类表中的Id列。这显然与上面的异常消息所说的无关


我在这里做错了什么,还是在NHibernate中发现了一个bug?

在非流利的NHibernate中,您必须在XML映射中设置:polymorphics=“explicit”

在旧版本的fluent nhibernate中似乎不起作用:

您可以尝试以下方法(我没有测试):

fluentConfiguration.Mappings(map=>map.AutoMappings.Add(
自动映射
其中(x=>x.IsSubclassOf(实体类型)))
.IncludeBase()
.polymorphics.Explicit()
.Conventions.Add(DefaultCascade.All());

不幸的是,这似乎不起作用-我仍然设法用hbm映射文件重新创建问题,因此在NHibernate项目中提出了一个问题。问题似乎只集中在Session.Lock和使用LockMode.Force时生成的UPDATE语句的使用上,否则版本控制似乎可以正常工作
[Test]
public void Should_Lock_Entity()
{
    using (var session = _sessionFactory.OpenSession())
    {
        var entity = new ChildOne {Address = "Some Address", Name = "Some Name"};
        session.Save(entity);
        session.Flush();
    }

    using (var session = _sessionFactory.OpenSession())
    {
        var entity = session.Query<ChildOne>().Single();
        //this is where the exception is raised
        session.Lock(entity, LockMode.Force); 
    }
}
UPDATE "AbstractBaseClass" 
SET Version = @p0 
WHERE AbstractBaseClass_id = @p1 AND Version = @p2;
@p0 = 2 [Type: Int32 (0)], @p1 = 1 [Type: Int64 (0)], @p2 = 1 [Type: Int32 (0)]
fluentConfiguration.Mappings(map => map.AutoMappings.Add(
            AutoMap.AssemblyOf<AbstractBaseClass>()
                .Where(x => x.IsSubclassOf(typeof(Entity)))
                .IncludeBase<AbstractBaseClass>()
                .Polymorphism.Explicit()
                .Conventions.Add(DefaultCascade.All())));