Я совершенно новичок во всей концепции ORM, NHibernate и FluentNH, и я пытаюсь сделать что-то, что кажется таким простым ...
Я пытаюсь получить объект, который имеет поле, определенное как Int64 в своем классе. Это поле будет идентификатором, как определено в файле карты.
При попытке извлечь запись из БД NHibernate возвращает следующее сообщение об ошибке: «Указан неверный тип. Ожидается: 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 для идентификатора все работает! Мне нужно использовать больший тип!
Большое спасибо!
РЕДАКТИРОВАТЬ 1: Как Aaronaught упоминает, я согласен, моя потребность в Int64 немного накладных расходов для хранения праздников ... Но на секунду давайте забудем " Праздники »концепция. Что я собираюсь делать с моей таблицей журналов (от 5 до 10 событий (строк) в секунду!). Спасибо!
РЕДАКТИРОВАТЬ 2: @Paco: я использую NHibernate 2.1.2.4000 и FluentNH 1.0.0.614
РЕДАКТИРОВАТЬ 3: После переобработки решения Daniel Schilling перестроить (совершенно новый) простой объект Holiday, который использовал Int64 в качестве идентификатора. Мне удалось успешно извлечь запись из БД. Как только я добавил отношение к объекту 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 ()
}