Generics 帮助Fluent NHibernate映射泛型类

Generics 帮助Fluent NHibernate映射泛型类,generics,fluent-nhibernate,Generics,Fluent 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 vi

我希望有人能在这方面帮助我,我正在尝试为一个被子类化为泛型类的类编写映射类。它更容易用代码描述,所以这里是我的模型

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; }
}
当我尝试构建数据库时,我的目标是Sql Server,从这个映射中我得到了一个错误“靠近'`'的语法不正确”

由于.Net命名泛型类(即

“{[Model.Tag'1[[Model.Asset,Model,Version=1.0.0,Culture=neutral,PublicKeyToken=null]].LinkedItems,NHibernate.Mapping.Bag(Model.Tag'1[[Model.Asset,Saturn.ConnectVision.Model,Version=1.0.0,Culture=neutral,PublicKeyToken=null].LinkedItems)]”

我在这里做些傻事吗

有办法解决这个问题吗


提前感谢您的建议。

好的,我现在似乎已经解决了这个问题

下面是标记的通用版本的映射,其中T:Itaged

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");
    }
}
公共类DisplayTagMap:子类映射
{
公共显示TagMap()
{
HasManyToMany(displayTag=>displayTag.LinkedItems).Inverse().Table(“DisplayTagLink”).ParentKeyColumn(“display_id”).ChildKeyColumn(“tag_id”);
}
}
公共类AssetTagMap:子类映射
{
公共资产负债表()
{
HasManyToMany(assetTag=>assetTag.LinkedItems).Inverse().Table(“AssetTagLink”).ParentKeyColumn(“资产id”).ChildKeyColumn(“标记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");
    }
}
公共类显示映射:类映射
{
公共显示地图()
{
Id(display=>display.Id);
Map(display=>display.Name).Not.Nullable();
映射(display=>display.DisplayGUID).Not.Nullable();
映射(display=>display.Description);
HasManyToMany(display=>display.Tags).Cascade.All().Table(“DisplayTagLink”).ParentKeyColumn(“display\u id”).ChildKeyColumn(“tag\u id”);
}
}
我现在唯一的问题是,如果我输入一个
DiscriminateSubclassesOnColumn(“TagType”)
,我就会遇到同样的语法问题

如果我错过了这个声明,我将得到另外两个表,Tag_Asset和Tag_Display,它们只包含一个返回到Tag的外键。现在这不是什么大不了的事

我避免了
DiscriminateSubClassOnColumn(“TagType”).SubClass(……
,因为这将导致我必须修改我添加的每个子类的声明

    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");
    }
}