【问题标题】:Using Auto Increment with MySQL, NHibernate and C#在 MySQL、NHibernate 和 C# 中使用自动增量
【发布时间】: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


【解决方案1】:

int 不能为空。你可以试试unsaved-value="0"

【讨论】:

  • 谢谢,但这没有任何区别。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-31
  • 1970-01-01
相关资源
最近更新 更多