Общий ADO. Исключение NHibernate - PullRequest
4 голосов
/ 15 июня 2011

У меня есть эта таблица:

ТАБЛИЦА «Набор»: [PK: IdSet (int), IdProject (int), IdSetState (int), IdPriority (int), NumSet (int), Unit (nchar), NumDisc (int)]

Итак, я делаю Test NUnit для вставки значения в эту таблицу.Это мой метод испытаний:

[Test]
public void Can_add_Set()
{
      var set = new Set { IdProject = 2, IdSetState = 2, NumDisc = 1, IdPriority = 3, NumSet = 100};
      setRepository.AddSet(set);
 }

И это мой метод вставки:

public void AddSet(Set set) 
    {
        using (ISession session = NHibernateSessionBuilder.OpenSession())
        using (ITransaction transaction = session.BeginTransaction())
        {
            session.Save(set);
            transaction.Commit();
        }
    }

Это Set.hbm.xml:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="AdminProject"
                   namespace="AdminProject.Business.Entity">

  <class name="Set">
    <id name="IdSet">
      <generator class="identity"/>
    </id>
    <property name="IdProject" />
    <property name="IdSetState" />
    <property name="IdPriority" />
    <property name="Unit" />
    <property name="NumDisc" />
    <property name="NumSet" />
  </class>

</hibernate-mapping> 

Когдаsession.save (комплект);которые показывают эту ошибку:

Общий ADO.Exception

"не удалось загрузить объект: [AdminProject.Business.Entity.Set # 5] [SQL: SELECT set0_.IdSet as IdSet2_0_, set0_:

1 Ответ

9 голосов
/ 15 июня 2011

Когда NHibernate генерирует подобное исключение, оно включает внутреннее исключение, генерируемое поставщиком ADO, которое в 99% случаев точно скажет, что было не так с ошибкой оператора SQL. Внутреннее исключение НАМНОГО более полезно; NH просто оборачивает его во что-то более общее, так что вы можете перехватить общее исключение вместо всех возможных исключений для конкретного поставщика, выдаваемых фактическим уровнем ADO.NET, который NH использует для передачи SQL.

Из того, что вы показали, мое подозрение номер один заключается в том, что столбцы в БД не имеют имен, точно совпадающих с вашими свойствами, и вы не указываете разные имена столбцов в отображении. Если вы указываете только свойство, имена свойств и столбцов должны совпадать в соответствии с параметрами сортировки БД (в основном это означает, что единственное возможное различие может быть регистром и только в БД без учета регистра).

Еще одна вещь, не связанная с ошибкой: ваша функция AddSet () не допускает внешнего управления транзакциями, поскольку каждая операция - это не просто собственная транзакция, а собственный сеанс. Как правило, это плохая идея, потому что если оба набора 1 и набор 2 должны быть добавлены, набор 1 вставлен, то набор 2 завершится неудачно, набор 1 все еще будет в БД. Обычно вы должны быть в состоянии сказать NHibernate, что несколько операций должны быть «все или ничего», позволяя коду получить некоторую ссылку Transaction или UnitOfWork, которую он может передавать в различные методы репозитория для идентификации контекста транзакции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...