Помогите беглому отображению NHibernate родового класса - PullRequest
2 голосов
/ 11 июня 2010

Я надеюсь, что кто-нибудь может помочь мне с этим, я пытаюсь написать классы отображения для класса, который подклассифицирован в общий класс.Проще описать код, поэтому вот моя модель ...

public abstract class TagBase
{
    public virtual int Id { get; private set; }
    public virtual TagTypeEnum TagType { get; set; }
    public virtual string Value { get; set; }
    public virtual bool IsSystemTag { get; private set; }
    public virtual bool isDeleted { get; set; }

    public TagBase()
    {
    }

    public TagBase(TagTypeEnum tagType)
    {
        this.TagType = tagType;
    }

    public override string ToString()
    {
        return Value;
    }
}

public class Tag<TLinkedItem> : TagBase where TLinkedItem : ITagged<TLinkedItem>
{
    public virtual List<TLinkedItem> LinkedItems { get; set; }
}

Как видите, Tag является универсальным, но ограничено только теми классами, которые реализуют ITagged<T>

Идея заключается в том, что у сущности есть теги, а в свою очередь у тега есть список строго типизированных LinkedItems.

Теги не могут быть общими для разных типов сущностей

У меня есть только две сущностив моей модели, поддерживающей тегирование, пока Display и Asset

Я пытался сопоставить это с помощью следующего кода Fluent NHibernate:

public class TagBaseMap : ClassMap<TagBase>
{
    public TagBaseMap()
    {
        Table("Tag");
        Id(tag => tag.Id);
        Map(tag => tag.Value).Not.Nullable().Length(50);
        Map(tag => tag.IsSystemTag).Not.Nullable();
        Map(tag => tag.isDeleted).Not.Nullable();
        Map(tag => tag.TagType).CustomType<Int32>().Not.Nullable();
    }
}

public class DisplayTagMap : SubclassMap<Tag<Display>>
{
    public DisplayTagMap()
    {
        HasManyToMany(displayTag => displayTag.LinkedItems).Inverse().Table("DisplayTagLink");
    }
}

public class AssetTagMap : SubclassMap<Tag<Asset>>
{
    public AssetTagMap()
    {
        HasManyToMany(assetTag => assetTag.LinkedItems).Inverse().Table("AssetTagLink");
    }
}

Когда я пытаюсь ипостроить базу данных, я нацеливаюсь на Sql Server, из этого сопоставления я получаю эту ошибку "Неверный синтаксис рядом с` `". "

Прав ли я в мысли, вызванной .Netименование общих классов, т. е.

'{[ Model.Tag'1 [[Model.Asset, Model, Version = 1.0.0.0, Culture = нейтральный, PublicKeyToken = null]].LinkedItems, NHibernate.Mapping.Bag ( Model.Tag'1 [[Model.Asset, Saturn.ConnectVision.Model, Версия = 1.0.0.0, Культура = нейтральная, PublicKeyToken = null]]. LinkedItems)]} '

Я что-то тут делаю глупо?

Есть ли способ обойти эту проблему?

Заранее спасибо за любые советы.

1 Ответ

1 голос
/ 14 июня 2010

Хорошо, я, кажется, уже обошел эту проблему.

Вот отображение для общих версий Tag, где T: ITagged

public class DisplayTagMap : SubclassMap<Tag<Display>>
{
    public DisplayTagMap()
    {
       HasManyToMany(displayTag => displayTag.LinkedItems).Inverse().Table("DisplayTagLink").ParentKeyColumn("display_id").ChildKeyColumn("tag_id");
    }
}

public class AssetTagMap : SubclassMap<Tag<Asset>>
{
    public AssetTagMap()
    {
        HasManyToMany(assetTag => assetTag.LinkedItems).Inverse().Table("AssetTagLink").ParentKeyColumn("asset_id").ChildKeyColumn("tag_id");
    }
}

Так что я переопределяю сгенерированные имена столбцов, которые вызывают недопустимый синтаксис Sql, конечно, есть обратное сопоставление.

    public class DisplayMap : ClassMap<Display>
{
    public DisplayMap()
    {
        Id(display => display.Id);
        Map(display => display.Name).Not.Nullable();
        Map(display => display.DisplayGUID).Not.Nullable();
        Map(display => display.Description);
        HasManyToMany(display => display.Tags).Cascade.All().Table("DisplayTagLink").ParentKeyColumn("display_id").ChildKeyColumn("tag_id");
    }
}

Единственная проблема, с которой я столкнулся сейчас, заключается в том, что если я вставлю DiscriminateSubclassesOnColumn("TagType"), я получу ту же самую проблему с синтаксисом.

Если я пропущу это объявление, я получу две дополнительные таблицы, Tag_Asset и Tag_Display, которые просто содержат внешний ключ к тегу. Пока это не такая уж большая проблема.

Я избежал DiscriminateSubClassOnColumn("TagType").SubClass<Tag<Display>>(....., потому что это заставит меня изменить это объявление для каждого подкласса, который я добавлю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...