【问题标题】:Help Fluent NHibernate Mapping a Generic Class帮助 Fluent NHibernate 映射泛型类
【发布时间】:2011-03-02 17:54:10
【问题描述】:

我希望有人可以帮助我解决这个问题,我正在尝试为一个子类化为泛型类的类编写映射类。用代码更容易描述,所以这是我的模型......

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&lt;T&gt; 的类

这个想法是一个实体有标签,而一个标签又具有一个强类型的 LinkedItem 列表。

标签不能在不同类型的实体之间共享

到目前为止,我的模型中只有两个实体支持标记,它们是 DisplayAsset

我尝试使用以下 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=neutral, PublicKeyToken=null]].LinkedItems, NHibernate.Mapping.Bag( Model.Tag'1[[Model.Asset, Saturn.ConnectVision.Model, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]].LinkedItems)]}'

我在这做傻事吗?

有没有办法解决这个问题?

提前感谢您的任何建议。

【问题讨论】:

    标签: generics fluent-nhibernate


    【解决方案1】:

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

    这里是 T : ITagged 的​​ Tag 通用版本的映射

    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,它们只包含一个返回 Tag 的外键。目前这没什么大不了的。

    我避免使用DiscriminateSubClassOnColumn("TagType").SubClass&lt;Tag&lt;Display&gt;&gt;(.....,因为这将导致我必须为我添加的每个子类修改此声明。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-09
      • 1970-01-01
      • 2015-05-23
      • 2011-04-10
      • 1970-01-01
      • 2011-03-14
      • 1970-01-01
      • 2010-11-30
      相关资源
      最近更新 更多