2010-08-21 3 views
1

У меня есть сущность с суррогатным идентификатором и составной 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(); 
} 

Благодаря

ответ

0

свойства являются .Not.ReadOnly по умолчанию.

Это естественный идентификатор, который по умолчанию не изменен.

С помощью XML-сопоставлений вам необходимо указать mutable="true". Ищите что-то подобное в Fluent (я не уверен, что он поддерживается)

+1

Проверка hbm, сгенерированного на бегство, я вижу, что Not.Readonly() устанавливает mutable = "true" в тег natural-id, но это все еще не удается. Таким образом, кажется, что проблема заключается в уровне NHibernate и вместо плавного отображения. Я обновил вопрос, чтобы добавить дополнительную информацию. –

+0

Я считаю, что ваш лучший вариант - удалить идентификатор natural-id и оставить оба свойства непосредственно в классе. В любом случае, это не так важно. –

+0

Спасибо Диего. То, что я делал в конце, было удаление объекта и создание нового. В этом конкретном случае это имеет смысл с точки зрения бизнес-логики, иначе я бы сделал то, что вы говорите, вероятно, комментарий, в котором указано, что эти свойства образуют естественный идентификатор. В очередной раз благодарим за помощь. –

Смежные вопросы