Свободное отображение NHibernate - Сохранение дочернего объекта - PullRequest
1 голос
/ 25 июня 2009

Мне кажется, у меня проблема с отображениями Fluent NHibernate, и я не могу понять, как мне следует настроить отображение, чтобы избежать проблемы.

У меня есть бизнес-объект (буквально "бизнес") и объект обзора. Каждый бизнес может иметь несколько обзоров, которые создаются на странице в пользовательском интерфейсе. Бизнес является собственностью Обзора следующим образом:

public class Business 
{
    public virtual int BusinessId {get;set;}
    public virtual DateTime LastModified {get;set;}
    public virtual IList<Review> Reviews {get;set;}

    [... more removed for brevity ...]

}

public class Review
{
    public virtual int ReviewId {get;set;}
    public virtual string ReviewText {get;set;}
    public virtual Business Business {get;set;}

    [... more removed for brevity ...]

}

Мои отображения таковы:

public class ReviewMap : ClassMap<Review>
{
    public ReviewMap()
    {
        WithTable("Reviews");
        Id(x => x.ReviewId).TheColumnNameIs("ReviewId").GeneratedBy.Identity();

        References(x => x.Business).TheColumnNameIs("BusinessId");

        Map(x => x.ReviewText);

       [... and so on...]
}


public class BusinessMap : ClassMap<Business>
{
    public BusinessMap()
    {
        WithTable("Businesses");

        Id(x => x.BusinessId).TheColumnNameIs("BusinessId").GeneratedBy.Identity();

        Map(x => x.Name).TheColumnNameIs("BusinessName");
        Map(x => x.LastModified, "LastModifiedOn");

        HasMany<Review>(x => x.Reviews)
            .Inverse()
            .LazyLoad();

        [... more removed for brevity ...]

    }
}

Код хранилища

public void Save(T entity)
    {
        using (ISession session = GetSession())
        using (ITransaction tx = session.BeginTransaction())
        {
            session.SaveOrUpdate(entity);
            tx.Commit();
        }
    }

В коде я назначаю свойства объекту Review и вызываю метод Save репозитория.

Проблема в том, что, поскольку я не обновляю Business per se, я не ожидаю, что он будет сохранен - ​​все, что я хочу, - это сохранение отзыва. Но код пытается сохранить также и Business, и я получаю исключение, поскольку я не установил свойство «LastModified» - и не хочу, поскольку я сохраняю ОБЗОР, а не бизнес.

Как мне настроить отображение, чтобы это произошло?

Ответы [ 3 ]

0 голосов
/ 26 июня 2009

Хорошо, поэтому проблема была в следующем: свойство LastModified Business не было фактически установлено в реальном бизнес-объекте, поскольку база данных допускала значение NULL для этого свойства.

Это означало, что когда я пытался сохранить обзор, он также пытался сохранить бизнес - скорее всего потому, что он распознал, что объект базы данных не имеет значения (null) для LastModified, но по умолчанию, поскольку LastModified является DateTime, его значением было DateTime.MinValue.

Как только я обновил бизнес-таблицу в базе данных, чтобы LastModified теперь не был равен NULL, он работает.

К несчастью, данные, с которыми я работал, попали в это состояние без проблем.

0 голосов
/ 26 июня 2009

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

Если вы хотите, чтобы столбец LastModified обнулялся, соответствующее свойство должно быть DateTime?, а не простым DateTime.

0 голосов
/ 25 июня 2009

Возможно, проблема возникла из-за необязательного ключевого требования между Business и Review. Бизнес (родительский) обычно должен быть сохранен до того, как обзор (дочерний) может быть.

Не могли бы вы включить отображение вашего бизнес-объекта, если это не помогает?

...