FluentNHibernate中的Mutable NaturalId在修改时抛出异常

时间:2010-08-21 20:37:16

标签: .net nhibernate fluent-nhibernate

我有一个具有代理ID的实体和一个用FluentNHibernate映射的复合NaturalId。我使自然id可变,标记为“Not.ReadOnly()”。类似的东西:

    public class EntityMap: ClassMap<Entity>
    {
        public EntityMap()
        {
            Id(x => x.Id);

            NaturalId().Not.ReadOnly()
                .Reference(x => x.OtherEntity, "OtherEntityId")
                .Property(x => x.IntegerProperty);

            // more fields
        }
   }

生成的xml类似于:

 <natural-id mutable="true">
      <property name="IntegerProperty" type="System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
        <column name="IntegerProperty" />
      </property>
      <many-to-one class="OtherEntity, OtherEntity, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" name="OtherEntity">
        <column name="OtherEntityId" />
      </many-to-one>
    </natural-id>

如果我更改了OtherEntity,则操作正常,并且实体在数据库中更新。如果我更改IntegerPropery,我会得到异常:“Namespace.Entity实例的不可变自然标识符已被更改”。

如果标记为mutable =“true”,为什么会抱怨“不可变的自然标识符”?

代码如下:

using (var session = SessionManager.OpenSession())
using (var tran = session.BeginTransaction())
{
   session.Update(entity);

   entity.IntegerProperty = (int)differentValue;

   tran.Commit();
}

由于

1 个答案:

答案 0 :(得分:0)

默认情况下,属性为.Not.ReadOnly

这是自然id,默认情况下是不可变的。

使用XML映射,您必须指定mutable="true"。在Fluent中寻找类似的东西(我不确定它是否支持)