【发布时间】:2010-01-26 22:00:29
【问题描述】:
我对 ORM、NHibernate 和 FluentNH 的整个概念还很陌生,我正在尝试完成一些看起来很简单的事情......
我正在尝试检索在其类中具有定义为 Int64 的字段的对象。该字段是地图文件中定义的 ID。
当尝试从数据库中检索记录时,NHibernate 返回以下错误消息:“提供的 id 类型错误。预期:System.Int32,得到 System.Int64”
我有一个非常简单的对象:
public class Holiday
{
public virtual Int64 HolidayID { get; set; }
public virtual string Name { get; set; }
public virtual int Day { get; set; }
public virtual int Month { get; set; }
public virtual bool IsActive { get; set; }
public virtual HolidayGroup Group { get; set; }
public Holiday() { }
}
映射文件(用于 FluentNH)如下:
public class HolidayMap : ClassMap<Holiday>
{
public HolidayMap()
{
Id(x => x.HolidayID);
Map(x => x.Name);
Map(x => x.Day);
Map(x => x.Month);
Map(x => x.IsActive);
HasOne(x => x.Group);
}
}
表结构(由NH生成)如下:
CREATE TABLE [dbo].[Holiday](
[HolidayID] [bigint] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](255) NULL,
[Day] [int] NULL,
[Month] [int] NULL,
[IsActive] [bit] NULL,
[HolidayGroup_id] [int] NULL,
PRIMARY KEY CLUSTERED
(
[HolidayID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
最后,我正在尝试使用以下方法检索 Holiday 实例:
public static Holiday Get(Int64 _holidayID)
{
Holiday _holiday = new Holiday();
try
{
using (var session = Global.NHibernate_SessionFactory.OpenSession())
{
_holiday = session.Get<Holiday>(_holidayID); // EXCEPTION OCCURS HERE
}
}
catch (Exception _ex)
{
// TODO : Implement proper logging
}
return _holiday;
}
我做错了什么??少了什么东西?当删除表并使用 Int32 作为 ID 重新定义我的对象时,一切正常!我需要使用更大的类型!
非常感谢!
编辑 1: 正如 Aaronaught 所提到的,我同意,我对 Int64 的需求是存储假期的一些开销......但是一秒钟,让我们忘记“假期”的概念。我将如何处理我的日志记录表(每秒 5 到 10 个事件(行)!)。谢谢!
编辑 2: @Paco:我正在使用 NHibernate 2.1.2.4000 和 FluentNH 1.0.0.614
编辑 3: 在重读 Daniel Schilling 的解决方案后,重建了一个(全新的)简单 Holiday 对象,该对象使用 Int64 作为 ID。我能够成功地从数据库中检索记录。一旦我向 Group 对象添加了关系,在实例化 Holiday 对象时,我收到与之前相同的错误消息...这是 HolidayGroup 类和映射,以防你能告诉我什么我做错了……
public class HolidayGroup
{
public virtual int HolidayGroupID { get; set;}
public virtual string Name { get; set; }
public virtual string Notes { get; set; }
public virtual bool IsActive { get; set; }
public virtual IList<Holiday> Holidays { get; set; }
public HolidayGroup()
{
Holidays = new List<Holiday>();
}
}
public HolidayGroupMap() { Id(x => x.HolidayGroupID); 地图(x => x.Name); 地图(x => x.Notes); 地图(x => x.IsActive); HasMany(x => x.Holidays) .Cascade.All() }
【问题讨论】:
-
虽然您的代码看起来不错,但我很确定您不需要大于
Int32的类型来存储假期列表(实际上,Int16可能绰绰有余)。 -
看起来像 NHiberante 中的一个错误。你用的是哪个版本?
-
您几乎可以将 Fluent NHibernate 排除在这个等式之外,因为它正在生成正确的模式。实际查询只是 NHibernate,因此,正如 Paco 所说,NH 本身可能存在错误。
标签: c# nhibernate sql-server-2008 fluent-nhibernate