2009-04-21 4 views
0

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

Это мой Entity класс

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

Вот мой Mapping

<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_ FROM Продукты product0_ WHERE 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) 

я делаю что-то неправильно?

+1

Есть ли внутреннее исключение внутри исключения? –

+1

Обычно, когда я получаю эту ошибку nhibernate, я пытаюсь скопировать и вставить SQL (с замененными параметрами) в студию Sql Management, чтобы убедиться, что я не делал что-то глупое и не ошибался в столбце. – Min

ответ

0

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

+0

Да. Я могу открыть соединение с БД. Вот код, который я использую Конфигурация cfg = new Configuration(); cfg.Configure(); cfg.AddAssembly (typeof (Product) .Сборка); ISessionFactory sessionFactory = cfg.BuildSessionFactory(); IDbConnection conn = new SqlConnection (@ "Источник данных = (локальный); Начальный каталог = Northwind; Integrated Security = SSPI;"); ISession session = sessionFactory.OpenSession (conn); Продукт продукта = (Продукт) session.Load (typeof (Product), 12); продукт.Desc = ""; – Seshan

+0

Вы установили свой HBM-файл для встраивания в сборку, когда он скомпилирован? –

+0

Да, я установил действие Build как встроенный ресурс !!! – Seshan

0

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

Я думаю, что «идентичность» не поддерживаются оракулом, это функция 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

Нет. Ошибка происходит даже с столбцом Sequence в Oracle. Ошибка возникает также в базе данных SQL Northwind с генератором как native или identity или hilo или guid. – Seshan

1

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

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

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 из сообщения об ошибке. Это работает?
  • соединение не открыто: см bollow

Я думаю, что вам нужно, чтобы открыть соединение самостоятельно. Еще лучше, если 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 = ""; 

CONNECTSTRING идет к 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

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

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

Смежные вопросы