У меня есть сущность с суррогатным идентификатором и составной NaturalId, сопоставленный с FluentNHibernate. Я делаю естественный id изменчивым, отмечая его «Not.ReadOnly()». Что-то вроде:Mutable NaturalId in FluentNHibernate выбрасывает исключение, если оно модифицировано
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();
}
Благодаря
Проверка hbm, сгенерированного на бегство, я вижу, что Not.Readonly() устанавливает mutable = "true" в тег natural-id, но это все еще не удается. Таким образом, кажется, что проблема заключается в уровне NHibernate и вместо плавного отображения. Я обновил вопрос, чтобы добавить дополнительную информацию. –
Я считаю, что ваш лучший вариант - удалить идентификатор natural-id и оставить оба свойства непосредственно в классе. В любом случае, это не так важно. –
Спасибо Диего. То, что я делал в конце, было удаление объекта и создание нового. В этом конкретном случае это имеет смысл с точки зрения бизнес-логики, иначе я бы сделал то, что вы говорите, вероятно, комментарий, в котором указано, что эти свойства образуют естественный идентификатор. В очередной раз благодарим за помощь. –