NHibernate 3.3 loquacious映射在使用约定时我的实体的id在保存后没有更新。可能的错误?

时间:2012-05-26 09:33:57

标签: c# nhibernate

简短版本:

当我保存实体时,在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事件中,有任何建议吗?

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

1 个答案:

答案 0 :(得分:2)

您的基于约定的块未定义哪个属性代表主键;只有它被映射到的数据库列,所以假设它是一个非映射的id(即NHibernate知道Id,你可以从NHibernate获取它,但它没有在域模型中表示)

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

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

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