NHibernate将id为0的值存储为null。

3

我有一个与nHibernate(fluent)相关的小问题。我有两个对象,一个包含另一个——一个父对象和一个子对象(预定义的只读对象)。

映射:

public class ParentClass
{
    public virtual int Id { get; set; } 
    public virtual ChildClass Metoda { get; set; }
}

public ParentClassMap() {
        Table("Wyceny");
        Id(x => x.Id).Column("Id").GeneratedBy.TriggerIdentity();
        References(x => x.Metoda).Column("RMW_ID");
}

public ChildClass 
{
        public virtual int Id { get; set; }
        public virtual string Nazwa { get; set; }
}

public ChildClassMap()
{
            Table("Metody");
            Id(x => x.Id).Column("Id");
            Map(x => x.Nazwa).Column("Nazwa_met");
}

在我选择id = 0的子对象之前,一切都运行得很完美,即使对于id = 0,读取仍然有效,但是当我尝试保存或更新具有正确ChildObject(通过nHibernate之前从数据库中读取)的Parent时,nHibernate存储null而不是值。

有什么建议吗?

nHibernate 3.3.1.4000 流畅的1.4.0.0

1个回答

6
这里的问题在于“未保存的值(unsaved-value)”。NHibernate必须决定对象操作是插入还是更新。这个决策源自“未保存的值”设置,对于整型默认设置为0。
尝试扩展你的ChildClass映射:
public ChildClassMap()
{
   Table("Metody");
   Id(x => x.Id)
       .Column("Id")
       .UnsavedValue(-1);
   ...

请参考5.1.4. id,其中写到:

unsaved-value(可选,默认为“合理”的值):标识一个实例是新创建的(未保存),与在先前会话中保存或加载的瞬态实例区分开来的标识属性值。

另外,这里有一篇由Adam Bar撰写的ID映射概述,非常详细。

很高兴看到这个。享受使用 NHibernate ;) - Radim Köhler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接