NHibernate не вставляет дочерние объекты в один-ко-многим

У меня есть классы Customer и Profile, где у одного клиента может быть много профилей.

Я использую с ними следующие классы переопределения NHibernate:

 public void Override(AutoMapping<Customer> mapping)
    {
        mapping.Table("[Customer]");
        mapping.Id(x => x.Id, "Id").GeneratedBy.Identity();

        mapping.HasMany(x => x.Profiles).Cascade.All().Inverse();

        mapping.Map(x => x.FirstName, "FirstName");
        mapping.Map(x => x.LastName, "LastName");
        mapping.Map(x => x.Email, "Email");            
    }

public void Override(AutoMapping<Profile> mapping)
    {
        mapping.Table("[Profile]");
        mapping.Id(x => x.Id, "Id").GeneratedBy.Identity();

        mapping.References(x => x.Customer, "Customer_Id").Cascade.None();

        mapping.Map(x => x.FacebookProfileLink, "FacebookProfileLink");
        mapping.Map(x => x.ContactPhone, "ContactPhone");          
    }

При вставке объекта Profile появляется следующая ошибка:

Невозможно вставить значение NULL в столбец «Customer_Id», таблица «dbo.Profile»; столбец не допускает значений NULL. Ошибка INSERT. \ R \ nОператор прерван.

Я намерен вставить объект Customer перед Profile, которому нужна ссылка на объект Customer. Вот почему я использую обратный атрибут. К сожалению, это не работает. Любая помощь по этому поводу? Спасибо.


person Trebor Sadnib    schedule 23.07.2013    source источник


Ответы (2)


Одна вещь, которую NHibernate делает как хороший ORM, - это сохранять все в отношениях, чтобы вам не приходилось сохранять вещи отдельно. Я думаю, ваша проблема может быть, но в том, что вы делаете, когда говорите «вставьте объект клиента перед профилем, которому нужна ссылка на клиента».

Реальность такова, что вы должны создать клиента с профилями, которые необходимо связать с ним, а затем просто сохранить этого клиента. NHibernate сохранит все сущности в правильном порядке, чтобы гарантировать сохранение отношений. Попробуйте сделать это, сначала создайте или извлеките объект клиента, затем добавьте / удалите профили, а затем сохраните клиента. Профили будут сохранены из-за каскадной опции, которую вы указали в сопоставлении.

Надеюсь, это поможет!

person Sergio A.    schedule 23.07.2013
comment
Спасибо за ваш ответ. просто попробовал по-своему (сохранение клиента с добавленными профилями), к сожалению, ошибка остается точно такой же :( - person Trebor Sadnib; 24.07.2013

Я нашел решение, которое мне подходит.

Я сохраняю сущность клиента без ссылки на ее профили. После этого я сохраняю сущность профиля.

Работает для меня даже лучше, чем решение, которое я хотел достичь раньше, поскольку я могу проверить успешность вставки клиента, а затем решить, что делать дальше (также сохранить профиль или сделать некоторую ошибку проверки).

Спасибо всем за ответы.

person Trebor Sadnib    schedule 24.07.2013
comment
Здорово, что кто-то выложил решение твоей проблемы. Отметьте, пожалуйста, выбранный вами ответ. - person gcso; 24.07.2013