2010-06-11 2 views
2

Я надеюсь, что кто-то может мне помочь, я пытаюсь написать классы сопоставления для класса, который подклассифицирован в общий класс. Его легче описав с кодом, так вот моя модель ...Help Fluent NHibernate Mapping Generic Class

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, от этого отображения я получаю эту ошибку «Неправильный синтаксис около„'.“»

Am I прямо в мышление, вызванное именовании .NET в общих классах т.е.

«{[Model.Tag'1 [[Model.Asset, модель, Version = 1.0.0.0, Culture = (Model.Tag'1 [[Model.Asset, Saturn.ConnectVision.Model, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null]]. .LinkedItems)]}

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

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

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

ответ

1

ОК, я, похоже, уже работал над этой проблемой.

Вот отображение для общих версий тегов, где 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>>(....., потому что это заставит меня изменить это объявление для каждого добавляемого подкласса.

Смежные вопросы