Ошибка отображения в NHibernate - PullRequest
0 голосов
/ 21 апреля 2009

Я пытаюсь использовать NHibernate для подключения к базе данных Northwind. Но по какой-то причине я не могу загрузить Тип сущности.

Это мой класс сущностей

public class Product
    {
        public virtual Int32 ProductId { get; set; }
        public virtual String Desc { get; set; }
    }

Вот мое отображение

 <class name="Product" table="Products">
    <id name="ProductId" column="ProductId" type="Int32">
      <generator class="identity"></generator>
    </id>
    <property name="Desc" column="ProductName" type="String" length="60">
    </property>
  </class>

Я получаю следующее сообщение об ошибке

не удалось загрузить объект: [OracleLinq.Product # 12] [SQL: SELECT product0_.ProductId в качестве ProductId0_0_, product0_.ProductName в качестве ProductN2_0_0_ ИЗ продуктов product0_ ГДЕ product0_.ProductId =?]

Вот трассировка стека

   at NHibernate.Loader.Loader.LoadEntity(ISessionImplementor session, Object id, IType identifierType, Object optionalObject, String optionalEntityName, Object optionalIdentifier, IEntityPersister persister)
   at NHibernate.Loader.Entity.AbstractEntityLoader.Load(ISessionImplementor session, Object id, Object optionalObject, Object optionalId)
   at NHibernate.Loader.Entity.AbstractEntityLoader.Load(Object id, Object optionalObject, ISessionImplementor session)
   at NHibernate.Persister.Entity.AbstractEntityPersister.Load(Object id, Object optionalObject, LockMode lockMode, ISessionImplementor session)
   at NHibernate.Event.Default.DefaultLoadEventListener.LoadFromDatasource(LoadEvent event, IEntityPersister persister, EntityKey keyToLoad, LoadType options)
   at NHibernate.Event.Default.DefaultLoadEventListener.DoLoad(LoadEvent event, IEntityPersister persister, EntityKey keyToLoad, LoadType options)
   at NHibernate.Event.Default.DefaultLoadEventListener.Load(LoadEvent event, IEntityPersister persister, EntityKey keyToLoad, LoadType options)
   at NHibernate.Event.Default.DefaultLoadEventListener.OnLoad(LoadEvent event, LoadType loadType)
   at NHibernate.Impl.SessionImpl.FireLoad(LoadEvent event, LoadType loadType)
   at NHibernate.Impl.SessionImpl.ImmediateLoad(String entityName, Object id)
   at NHibernate.Proxy.AbstractLazyInitializer.Initialize()
   at NHibernate.Proxy.AbstractLazyInitializer.GetImplementation()
   at NHibernate.Proxy.Poco.Castle.CastleLazyInitializer.Intercept(IInvocation invocation)
   at Castle.DynamicProxy.AbstractInvocation.Proceed()
   at ProductProxy4c67cf5bf6e640ab82d8c21a90e2a62b.set_Desc(String value)
   at OracleLinq.Form1.Form1_Load(Object sender, EventArgs e)

Я что-то не так делаю?

Ответы [ 4 ]

1 голос
/ 24 апреля 2009

Вторая попытка:

Вот вам конфигурация из ваших комментариев, просто для удобства чтения:

Configuration cfg = new Configuration(); 
cfg.Configure(); 
cfg.AddAssembly(typeof(Product).Assembly); 
ISessionFactory sessionFactory = cfg.BuildSessionFactory(); 

IDbConnection conn = new SqlConnection(@"Data Source=(local);Initial Catalog=Northwind;Integrated Security=SSPI;"); 
ISession session = sessionFactory.OpenSession(conn); 

Product product = (Product)session.Load(typeof(Product), 12); 
product.Desc = "";

Понятно, что NHibernate имеет файл сопоставления, он не мог сгенерировать запрос.

Может быть,

  • база данных не существует : вы уже проверили это.
  • таблицы нет : откройте консоль sql (используя ту же строку подключения) и скопируйте в нее sql из сообщения об ошибке Это работает?
  • соединение не открыто : см. Ниже

Я думаю, что вам нужно открыть соединение самостоятельно. Еще лучше, если вы позволите NHibernate создавать и управлять соединениями.

Попробуйте это:

Configuration cfg = new Configuration(); 
cfg.Configure(); 
cfg.AddAssembly(typeof(Product).Assembly); 
ISessionFactory sessionFactory = cfg.BuildSessionFactory(); 

ISession session = sessionFactory.OpenSession(); 

Product product = (Product)session.Load(typeof(Product), 12); 
product.Desc = "";

строка подключения отправляется в nhibernate.cfg.xml

<property name="connection.provider">NHibernate.Connection.DriverConnectionProvider, NHibernate</property>
<property name="connection.connection_string">
 Data Source=(local);Initial Catalog=Northwind;Integrated Security=SSPI;
</property>
<property name="dialect">NHibernate.Dialect.MsSql2000Dialect</property>
0 голосов
/ 31 июля 2012

В вашей трассировке стека я вижу ProductProxy4c67cf5bf6e640ab82d8c21a90e2a62b.set_Desc(String value), что означает, что ошибка возникает при установке свойства Desc. В этот момент NHibernate пытается загрузить продукт из базы данных.

В вашей базе данных нет продукта с идентификатором, который вы указали для Session.Load. Если вы используете Session.Get, вы, вероятно, получите null.

0 голосов
/ 22 апреля 2009

На самом деле это может быть проблемой только при вставке, но вы также можете столкнуться с проблемами:

Я думаю, что «идентичность» не поддерживается оракулом, это функция SqlServer (первичный ключ с автоматическим подсчетом). Oracle использует последовательности.

Попробуйте следующее (проверьте название последовательности, которая должна существовать)

<id name="ProductId" column="ProductId" type="Int32">
  <generator class="sequence">
    <param name="sequence">product_seq</param>
  </generator>
</id>

Или другой генератор идентификаторов. Хило или Гуид - интересные альтернативы. Смотри http://barchitect.blogspot.com/2008/07/nhibernate-generator-and-primary-key.html

0 голосов
/ 21 апреля 2009

По умолчанию в строке подключения указана правильная база данных? Убедитесь, что у него есть Initial Catalog = [имя БД здесь]

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