Я столкнулся с некоторыми проблемами, пытаясь смоделировать свою бизнес-логику с помощью сопоставления NHibernate Fluent.

У меня есть такая модель сущности:

public class Request
{
    ...
    public virtual Response Response {get; set;}
}

public class Response
{
    ...
    public virtual Request Request {get; set;}
}

Моя сущность Request должна существовать без сущности Response, и наоборот, моя сущность Response должна существовать без Request. Можно ли это отобразить как однозначное сопоставление ? Я знаю, что похоже на то, что Response может существовать без Request, но это могло произойти в моей ситуации.

Я прочитал статью Думаю Вы имеете в виду "многие-к-одному", сэр, но я все же считаю, что сопоставление "многие-к-одному" мне не подходит, поскольку ни одна из моих сущностей не должна иметь список ответов или запросов .

Как следует отобразить эту ситуацию?

ИЗМЕНИТЬ 1

Моя карта Fluent с использованием ассоциации внешнего ключа из Как выполнить быстрое сопоставление nhibernate "один к одному"? :

public RequestMap()
{
    Id(x => x.Id).GeneratedBy.Guid();
    References(x => x.Response, "ResponseId").Unique().Cascade.All();
}

public ResponseMap()
{
    Id(x => x.Id).GeneratedBy.Guid();
    HasOne(x => x.Request).Cascade.All().PropertyRef(x => x.Response);
}

Кажется, это работает во многих ситуациях, но когда я пытаюсь добавить несколько объектов Request без ссылки на объект Response, я получаю следующую ошибку:

System.Data.SqlClient.SqlException: нарушение ограничения UNIQUE KEY 'UQ__Request__346FA94719588CEC'. Невозможно вставить повторяющийся ключ в объект 'dbo.Request'. Повторяющееся значение ключа - (). Заявление было прекращено.

ИЗМЕНИТЬ 2

public RequestMap()
{
    Id(x => x.Id).GeneratedBy.Guid();
    HasOne(x => x.Response).Cascade.All().PropertyRef(x => x.Request);
}

public ResponseMap()
{
    Id(x => x.Id).GeneratedBy.Guid();
    References(x => x.Request, "RequestId").Cascade.All();
}

Используя это сопоставление, сопоставление между объектами не сохраняется при выполнении request.Response = response;. Следует ли мне сделать это сеттер защищенным?

0
dhrm 17 Дек 2013 в 23:44

2 ответа

Лучший ответ

Проблема с вашим EDIT 1 возникает из следующих фактов:

  • Таблица Request действительно имеет уникальное ограничение на столбец ResponseId. Т.е. каждая строка должна иметь разное значение
  • Requests, хранящийся без ссылки на Response , действительно имеет NULL вместо любого значения ... все из них. И это нарушает указанное выше требование, чтобы каждая строка была уникальной.

Решением в этом случае было бы удалить уникальный ключ на уровне БД из столбца ResponseId. Потому что это то, что нам нужно ( Запрос без ответа ). Т.е. должно быть разрешено несколько одновременных значений NULL в ReponseId.

Но что меня немного сбивает с толку, так это название: Reponse / Request

Мне кажется, что Request (из моего опыта веб-разработки) - это триггер, первый. И если все в порядке, ответ будет отправлен. Разве ваше отображение не должно быть перевернуто? Таблица ответов содержит RequestId?

Я видел это утверждение в вопросе:

Моя сущность запроса должна существовать без сущности ответа, и наоборот, моя сущность ответа должна существовать без запроса .

Итак ... предположим, что: Response может НЕ жить без Request ... тогда ваше сопоставление (но перевернутое) должно работать даже с уникальным ключом сдерживающий.

И что еще более важно, тогда будет работать чистое сопоставление one-to-one, потому что эти двое могут совместно использовать первичный ключ (сгенерированный запросом, потребленный ответом)

1
Radim Köhler 18 Дек 2013 в 04:05

Возможно, я неправильно понял вопрос, но для этого, кажется, требуется сопоставить одну из сущностей с помощью «Ссылки», а другую - с помощью «> Инвертированные <ссылки».

Пожалуйста, посмотрите здесь Как сделать беглый nhibernate к одному отображению?

1
Community 23 Май 2017 в 12:22