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
事件中,有什么建议吗?
我错过了什么吗?还是这是一个错误?
基于约定的块不定义哪个属性表示主键;只定义它映射到哪个数据库列,因此假定它是非映射的 ID(即 NHibernate 知道 Id,您可以从 NHibernate 获取它,但它不在域模型中表示)
当您手动映射它时,您正在定义属性,并且默认情况下该列使用相同的名称;这就是它工作的原因。
此附加约定将负责定义 Id 属性
mapper.IsPersistentId((mi, d) => mi.Name == mi.DeclaringType.Name + "Id");