Неверный индекс N для этой SqlParameterCollection с Count = N, только когда в связанной таблице есть нулевая запись - PullRequest
5 голосов
/ 28 сентября 2011

У меня довольно сложный объект, который не будет сохраняться, если в конкретной таблице базы данных отсутствует запись. Когда запись существует, сущность сохраняется правильно. При записи не получаю исключение:

Недопустимый индекс 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;

Что мне не хватает в моих отображениях, которые могли бы вызвать это исключение? Есть еще одна часть этой проблемы, которую я не вижу?

Ответы [ 2 ]

2 голосов
/ 30 сентября 2011

Хотя решение Скотта об удалении свойства snl_id из класса Customer решает проблему, оно вызывает проблемы, которые я не могу обойти - snl_id может существовать в таблице Customer, даже если нет соответствующей записи таблицы Person. Поскольку это так, бывают случаи, когда мне нужен доступ к snl_id, когда я не могу получить к нему доступ через связанное свойство Person.

Я рассмотрел несколько альтернативных решений, но остановился на создании представления таблицы Customer, включая первичный ключ таблицы Customer и snl_id из таблицы customer . Затем сопоставьте это свойство с помощью объединения с представлением.

Join("v_cust_id_snl_id", j => j.KeyColumn("cust_id").Map(x => x.SnlId, "snl_id")

Это изменение позволило мне съесть свой пирог и съесть его. Я смог сохранить свойство SnlId на клиенте, но больше не выбрасывал исключение при сохранении.

1 голос
/ 28 сентября 2011

Есть ли у вас snl_id, упоминаемый как свойство в Customer, а также как первичный ключ для дочернего объекта? Если это так, это вызывает ошибку, которую вы получаете. Удалите свойство из Customer и используйте Person для получения значения.

...