2009-04-21 160 views
0

我想用NHibernate连接到Northwind数据库。但由于某种原因,我无法加载实体类型。NHibernate映射错误

这是我的实体类

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 as ProductId0_0_,product0_.ProductName as ProductN2_0_0_ FROM Products 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

异常内部是否存在内部异常? – 2009-04-21 21:47:47

+1

通常每当我得到这个nhibernate错误时,我都会尝试在Sql Management Studio中复制并粘贴SQL(使用替换的参数),以确保我没有做一些愚蠢的事情并拼错一列。 – Min 2009-04-23 21:55:45

回答

0

您的连接字符串是否默认为正确的数据库?检查确认其初始目录= [DB这里名称]

+0

是的。我可以打开数据库连接。这里是我使用的代码 配置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 =“”; – Seshan 2009-04-21 19:59:41

0

这实际上应该只有在插入时有问题,但你也可以得到它的烦恼:

我觉得“身份”不受Oracle支持,它是一个SqlServer功能(一个自动计数主键)。 Oracle使用序列。

请尝试以下(检查顺序,必须存在的名称)

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

或其它ID生成。 Hilo或Guid是有趣的选择。见http://barchitect.blogspot.com/2008/07/nhibernate-generator-and-primary-key.html

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

在你的堆栈跟踪,我看到ProductProxy4c67cf5bf6e640ab82d8c21a90e2a62b.set_Desc(String value),这意味着发生错误时,你设置的“说明'财产。这是NHibernate尝试从数据库加载产品的时刻。

在您的数据库中,您没有提供给Session.Load的id的产品。如果你使用Session.Get,你可能会得到空值。