NHibernate 3.3 使用约定时的对话映射 保存后我的实体的 ID 不会更新.可能的错误

本文关键字:实体 ID 更新 错误 我的 保存 约定 定时 对话 NHibernate 映射 | 更新日期: 2023-09-27 18:35:34

简短版本:

当我保存实体时,在NHibernate3.3中使用约定时,id属性不会更新

详细版本:

实体 ID 属性

public virtual Guid GuitarId { get; protected set; }

通过此映射,我的实体被正确保存在数据库中,但我的实体的 id 没有被填充,即使我尝试加载我的实体,它们也被简单地忽略了......

    mapper.BeforeMapClass += (model, type, classCustomizer) =>
    {
        classCustomizer.Id(x =>
        {
            x.Column(type.Name + "Id");
            x.Generator(Generators.GuidComb);
        });
    };

尝试获取已保存的实体,我填充了除 Id 之外的实体的所有字段,我尝试访问 id 属性以防万一它延迟加载但没有运气:

var g = session.Get<Guitar>(existingId);

如果我覆盖实体的 id 映射,我会在保存后正确填充 id 属性

    mapper.Class<Guitar>(map =>
    {
        map.Id(x => x.GuitarId, x =>
        {
            x.Generator(Generators.GuidComb);
        });
    });

所以问题出在BeforeMapClass事件中,有什么建议吗?

我错过了什么吗?还是这是一个错误?

NHibernate 3.3 使用约定时的对话映射 保存后我的实体的 ID 不会更新.可能的错误

基于约定的块不定义哪个属性表示主键;只定义它映射到哪个数据库列,因此假定它是非映射的 ID(即 NHibernate 知道 Id,您可以从 NHibernate 获取它,但它不在域模型中表示)

当您手动映射它时,您正在定义属性,并且默认情况下该列使用相同的名称;这就是它工作的原因。

此附加约定将负责定义 Id 属性

mapper.IsPersistentId((mi, d) => mi.Name == mi.DeclaringType.Name + "Id");