NHibernate映射错误

我想用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)

难道我做错了什么?

回答:

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

回答:

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

我觉得“身份”不受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

回答:

第二个尝试:

这里是你的意见,你的配置,只是可读性:

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>

回答:

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

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

以上是 NHibernate映射错误 的全部内容, 来源链接: utcz.com/qa/261146.html

回到顶部