【发布时间】:2014-09-22 21:17:17
【问题描述】:
编辑 - 原来我们的问题与主键映射完全无关——在这个特定实例中,错误将我指向了错误的方向。
我正在尝试将一个简单的 auto_incremented 主键映射到 c# 中的属性。这是我目前拥有的 hbm 映射:
<class name="Lobby" table="lobby">
<id name="Id" type="int" unsaved-value="null" >
<column name="id" not-null="true"/>
<generator class="identity"/>
</id>
...
</class>
这是我的课:
public class Lobby
{
public virtual int Id { get; set; }
...
}
表声明如下:
CREATE TABLE IF NOT EXISTS `lobby`
(
`id` INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
...
)
当我尝试使用存储库创建对象时:
using (var session = mSessionFactory.OpenSession())
using (var transaction = session.BeginTransaction())
{
session.Save(newEntry);
transaction.Commit();
}
我得到一个 PropertyTypeException:
Lobby.Id 的 getter 发生异常> 对象与目标类型不匹配。
我尝试将属性更改为长短,但没有帮助。我还尝试使列不是auto_incremented 并使用“增量”生成器,但这会生成一个不包含“id”属性的插入查询,然后由于需要设置主键而失败。
任何人都可以看到我做错了什么吗?是否有任何示例说明如何正确执行此操作?
【问题讨论】:
-
这个问题通常与真实类型错误映射有关。大多数情况下,如果字符串或 guid 列映射到 int 或者其次如果引用类型与 int 互换...所以请尝试真正深入检查您的类型是否匹配... NHibernate 是可预测的 ;) 我见过你的更新..但仍然...也许您针对不同的数据库...或...
-
据我所知 - int == "int" == INT。该类型在不是 auto_incremented 时似乎映射得很好,只有当它在表上设置为 auto_increment 时才会引发此错误。
-
嗯……很奇怪,真的。实际上,您的问题有些奇怪:...“increment”生成器,但这会生成一个不包含“id”属性的插入查询...我希望完全相反,因为增量总是会插入 ID 列(因为 NHibernate 确实插入,而不是 DB)
-
Bok,建议:您能否创建全新的表更改您对该表的映射并检查它?我真的怀疑一些“未公开”的处理(错误的连接字符串、错误的数据库、错误的表)
-
对不起,先生,没有更多的想法;(...请确保我当然在本地进行了相同的测试...但是使用 SQL Server...并且一切正常...但是 SQL Server不是你的情况;(
标签: c# mysql nhibernate nhibernate-mapping