简短版本:
当我保存实体时,在NHibernate 3.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
事件中,有任何建议吗?
我错过了什么吗?或者这是一个错误?
答案 0 :(得分:2)
您的基于约定的块未定义哪个属性代表主键;只有它被映射到的数据库列,所以假设它是一个非映射的id(即NHibernate知道Id,你可以从NHibernate获取它,但它没有在域模型中表示)
手动映射时,您正在定义属性,默认情况下该列使用相同的名称;这就是它的原因。
此附加约定将负责定义Id属性
mapper.IsPersistentId((mi, d) => mi.Name == mi.DeclaringType.Name + "Id");