我有一个具有代理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();
}
由于
答案 0 :(得分:0)
默认情况下,属性为.Not.ReadOnly
。
这是自然id,默认情况下是不可变的。
使用XML映射,您必须指定mutable="true"
。在Fluent中寻找类似的东西(我不确定它是否支持)