Нужна помощь с отображением FluentNHibernate - PullRequest
2 голосов
/ 10 ноября 2010

У меня есть следующие объекты

alt text

, и я пытаюсь отобразить их с помощью FluentNHibernate.

Некоторые примечания об объектах:

  • Атрибуты CreatedBy и AssignedTo в сущности Task имеют тип Person и на стороне базы данных являются столбцами типа int, которые называются соответственно CreatorID и AssigneeID
  • Атрибут WrittenBy в сущности Note имеет тип Person и сохраняется в базе данных в столбце с именем AuthorID

Я не собираюсь включать все сопоставления здесь, как естьможет быть, не нужно, но самая большая проблема, с которой я столкнулся, возникла, когда я добавил Задачу и отображение заметки.

Теперь фактически, если я пытаюсь добавить Адрес к объекту Person, NHibernate пытается выполнитьследующий запрос

UPDATE Addresses SET AuthorID = @p0 WHERE AddressID = @p1;

Где я не так с этим?

РЕДАКТИРОВАТЬ : добавлено отображение сущностей

public PersonMap() {
    Table( "Persons" );
    Id( c => c.PersonID ).Column( "PersonID" ).GeneratedBy.Identity();
    References( c => c.Company ).Column( "CompanyID" );
    HasMany( c => c.Addresses ).Cascade.SaveUpdate();
    HasMany( c => c.TasksAsCreator ).Cascade.SaveUpdate();
    HasMany( c => c.TasksAsAssignee ).Cascade.SaveUpdate();
    HasMany( c => c.NotesAsAuthor ).Cascade.SaveUpdate();
}

public TaskMap() {
    Table( "Tasks" );
    Id( i => i.TaskID ).Column( "TaskID" ).GeneratedBy.Identity();
    References( i => i.Company ).Column( "CompanyID" );
    References( i => i.CreatedBy ).Column( "CreatorID" );
    References( i => i.AssignedTo ).Column( "AssigneeID" );
    HasMany( i => i.Notes ).Cascade.SaveUpdate();
}

public NoteMap() {
    Table( "Notes" );
    Id( n => n.NoteID ).Column( "NoteID" ).GeneratedBy.Identity();
    References( n => n.Task ).Column( "TaskID" );
    References( n => n.WrittenBy ).Column( "AuthorID" );
}

РЕДАКТИРОВАТЬ 2 : после экспорта сопоставления (спасибо dotjoe) я нашел много странныхрезультат, следующий за

<bag cascade="save-update" name="NotesAsAuthor" mutable="true">
  <key>
    <column name="CreatorID" />
  </key>
  <one-to-many class="Note, GSLConverter, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</bag>

Это совершенно неверно! И не отражает отображение, показанное выше ....

Ответы [ 2 ]

2 голосов
/ 10 ноября 2010

Можете ли вы отобразить сопоставления для свойств, связанных с сущностью Person? Я бы позаботился о том, чтобы вы указали одинаковые имена столбцов fk с обеих сторон (Reference и HasMany) в отображениях Note / Task to Person. Я видел это раньше ... Я думаю, что это ошибка в Fluent, когда он использует ранее указанное имя столбца для типа в другом отображении. Также убедитесь, что у вас установлена ​​последняя версия Fluent.

Для устранения неполадок вы можете просмотреть сгенерированные сопоставления xml с помощью метода ExportTo FluentMappingsContainer ...

var factory = Fluently.Configure()
                .Mappings(mc =>
                    mc.FluentMappings.AddFromAssemblyOf<PersonMap>().ExportTo("."))
                .BuildSessionFactory();
1 голос
/ 11 ноября 2010

Я не уверен, откуда Fluent nHibernate получает имя столбца CreatorID, но в соответствии с документами вы можете указать его, используя метод KeyColumn

HasMany( c => c.NotesAsAuthor ).KeyColumn("AuthorId").Cascade.SaveUpdate();

Передо мной нет тестового проекта, поэтому попробуйте и дайте мне знать, если он работает.

...