2010-06-11 30 views
2

我希望有人可以幫助我,我想寫一個類的子類映射到泛型類的映射類。它更容易使用代碼來descibe,所以這裏是我的模型......幫助流利的NHibernate映射泛型類

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>

的想法是,一個實體類標籤又有一個標籤有一個強類型的LinkedItem列表。

標籤不能提供各種不同的實體的共享

我只有兩個實體在我的模型,支持標籤到目前爲止大公被DisplayAsset

我試着用下面的流利映射此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服務器,從這個映射我得到這個錯誤「附近有語法錯誤''。」

我說得對不對由泛型類即淨的命名思維造成的,

「{[Model.Tag'1 [Model.Asset,型號,版本= 1.0.0.0,文化=中立,PublicKeyToken = null]]。LinkedItems,NHibernate.Mapping.Bag(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>>(.....,因爲這將導致我不得不爲我添加的每個子類修改此聲明。