0

简短版本:

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

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

4

1 回答 1

2

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

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

这个额外的约定将负责定义 Id 属性

mapper.IsPersistentId((mi, d) => mi.Name == mi.DeclaringType.Name + "Id");
于 2012-05-26T13:34:50.487 回答