У меня довольно сложный объект, который не будет сохраняться, если в конкретной таблице базы данных отсутствует запись. Когда запись существует, сущность сохраняется правильно. При записи не получаю исключение:
Недопустимый индекс N для этой SqlParameterCollection с Count = N
После прочтения множества решений, найденных через Google, и наиболее тесно связанных вопросов по переполнению стека:
Я полагаю, что моя проблема связана с тем, как у меня настроены файлы сопоставления. Сущность Customer имеет ссылку на сущность Person. Человек отображается на таблицу, которую мы прочитали, но не имеем права на запись. Это когда запись для сущности Person не существует, я генерирую исключение. Если запись существует, не проблема. Я установил ссылку на Персона от клиента на Nullable()
. Я также дважды проверил, чтобы убедиться, что у меня нет свойства, сопоставленного дважды ни от одного объекта.
Вот то, что я считаю необходимой информацией о сопоставлении, но могу предоставить больше при необходимости:
Клиент
//more mapping code...
References(x => x.Person, "snl_id").Nullable();
//more mapping code...
Человек
//more mapping code...
ReadOnly();
Id(x => x.SnlId).Column("SNL_ID");
//more mapping code...
Чтобы еще больше усложнить ситуацию, у нас есть болезненный код, который заставляет NHibernate работать лучше, когда Person не существует. Я не уверен, что это применимо здесь, но подумал, что это достаточно уместно, чтобы включить в мой вопрос. Мы используем приведенный ниже код, потому что без него NHIRnate JIRA будет создавать тонны запросов. Это решение описано в этом ответе переполнения стека .
Собственность лица клиента
public virtual Person Person
{
get
{
try
{
var snlId = per.Name;
return per;
}
catch
{
return null;
}
}
set
{
per = value;
}
}
private EPerson per;
Что мне не хватает в моих отображениях, которые могли бы вызвать это исключение? Есть еще одна часть этой проблемы, которую я не вижу?