Я только начинаю с NHibernate, и я пытаюсь объединиться с устаревшей таблицей, которая использует значения 0
вместо NULL
, чтобы представить что-то не существует.
Есть такжестрока с идентификатором 0
в базе данных, которая является просто заполнителем.
Я бы не хотела извлекать этот заполнитель, и вместо этого я хочу, чтобы мое свойство отображалось как null
.
Я пытался создать IUserType
для обработки сопоставления значения 0
на null
и обратно, но я не думаю, что сопоставления «многие к одному» (.References()
) работают с пользовательскими типами.
Это класс:
public class Category
{
public virtual int Id { get; set; }
public virtual string CategoryName { get; set; }
public virtual Category Parent { get; set; }
public virtual IList<Category> Children { get; set; }
public virtual Category RealCategory { get; set; }
public virtual bool IsHomeParent { get; set; }
}
Это отображение:
public class CategoryMapping:ClassMap<Category>
{
public CategoryMapping()
{
Id(x => x.Id);
Map(x => x.CategoryName);
Join("categorymappings",
m =>
{
m.KeyColumn("categoryid");
m.Map(z => z.IsHomeParent);
// need ids of 0 to come up as null for .Parent
m.References(z => z.Parent).Column("parentcategoryid");
m.References(z => z.RealCategory).Column("realcategoryid").Not.LazyLoad();
m.Optional();
});
HasManyToMany(p => p.Children)
.Table("categorymappings")
.ParentKeyColumn("parentcategoryid")
.ChildKeyColumn("categoryid")
.Where("ishomeparent=0")
.Fetch.Join()
.Not.LazyLoad();
Table("categories");
}
}
Итак, еще раз.Я пытаюсь получить .Parent
, чтобы быть null
для идентификаторов 0
.
В связанной заметке, есть также бесконечная проблема рекурсивности с данными в устаревшей базе данных, которую мне нужно избегать,
Когда категория находится на самом верхнем уровне, categoryid
равно parentcategoryid
(например, categoryid=1
, parentcategoryid=1
) в таблице сопоставления.
Это дает мне .Parent property
, который продолжает ссылаться на один и тот же объект снова и снова.(таким образом, .Parent.Parent.Parent.Parent.etc
- это тот же объект)
Кажется, NHibernate достаточно умен, чтобы в конечном итоге сдаться, но он значительно замедляет процесс.
Таким образом, в идеале отображение должно быть определено таким образом, чтобы в случае parentcategoryid=categoryid
или parentcategoryid=0
столбец .Parent
игнорировался (устанавливался в null
).
Можно ли это сделать с помощью отображений Fluent?