Работа с неудобными значениями в устаревшей таблице с помощью NHibernate - PullRequest
0 голосов
/ 28 января 2011

Я только начинаю с 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?

1 Ответ

2 голосов
/ 28 января 2011

Если возможно, используйте представление для фильтрации строки с идентификатором 0.

Для второй проблемы, сопоставьте родительский объект как личное поле и выставьте его, как в примере ниже. Возвращает нулевого родителя, если объект и его родитель совпадают.

public virtual Category ParentCategory
{
    get { return CategoryId == _parentCategory.CategoryId ? null : _parentCategory; }
    set { _parentCategory = value ?? this; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...