Fluent nhibernate FluentNHibernate:当一对多是一个简单枚举时,如何处理一对多值

Fluent nhibernate FluentNHibernate:当一对多是一个简单枚举时,如何处理一对多值,fluent-nhibernate,Fluent Nhibernate,以下情况似乎并不少见,但我不知道如何在FluenHibernate中处理它: public class Product: BaseEntity { public Product() { Categories = new List<Category>(); } public virtual IList<Category> Categories { get; set; } ... } public enum Cate

以下情况似乎并不少见,但我不知道如何在FluenHibernate中处理它:

public class Product: BaseEntity
{
    public Product()
    {
        Categories = new List<Category>();
    }

    public virtual IList<Category> Categories { get; set; }
    ...
}

public enum Categories
{
    Classic = 1,
    Modern = 2,
    Trendy = 3,
    ...
}
公共类产品:BaseEntity
{
公共产品()
{
类别=新列表();
}
公共虚拟IList类别{get;set;}
...
}
公共枚举类别
{
经典=1,
现代=2,
Trendy=3,
...
}
所以,我需要一个ProductCategories表,它允许我将一个产品映射到多个类别,但我认为NHibernate不会处理这个问题,除非我有一个实际的categories类和一个指定了多对多关系的categories表。这是不可取的原因有很多,其中最重要的一个原因是它的杀伤力过大

我正在使用AutoMapper-我可以用任何方法覆盖它以使其工作吗


谢谢

有几种方法可以做到这一点,但没有一种方法像您预期的那样简单。虽然NHibernate和Fluent NHibernate在单个
枚举
上做得很好,但集合要麻烦得多

以下是几种方法:

  • 通过连接成员,将集合持久化为单个
    nvarchar(?)
  • 使用
    Flags
    属性标记
    enum
    ,并将列表折叠为位掩码(这只需要一个整数列)
  • 在任何一种情况下,您都可以让NHibernate访问包含“折叠”值的字段;公共属性的getter将把折叠的值转换为集合。折叠值的getter将集合转换为单个字符串(1)或整数(2)

    您必须明确地映射
    产品

    public class ProductMap : ClassMap<Product>
    {
        public ProductMap()
        {
            Id(x => x.Id);
    
            Map(Reveal.Member<Product>("_categories"))
                .Access.Field();
        }
    }
    
    公共类ProductMap:ClassMap
    {
    公共产品地图()
    {
    Id(x=>x.Id);
    地图(显示成员(“\u类别”))
    .Access.Field();
    }
    }
    

    因此,尽管
    产品
    公开了一个
    IList
    ,NHibernate将只获取并设置
    \u categories
    字段的值

    在工作中,虽然它不涉及枚举值的集合,但我们创建了一个自定义类型(通过实现
    IUserType
    来存储
    IDictionary

    我们将字典转换为xml文档(XDocument),并将数据存储在Sql Server的xml列中,尽管任何字符串列都可以存储该值


    您可以查看有关实现
    IUserType
    的信息,我在另一个类似的实例中尝试了连接字符串,但我确实想要一些不需要每次转换的内容。事实证明,我在这里发现了一个非常类似的问题:。如前所述,此重写有效:

    public void Override(AutoMapping<Product> mapping)
    {
         mapping.HasMany(x => x.Categories).KeyColumn("ProductFk").Table("CategoriesProductsMap").Element("Category").AsBag();
    }
    
    public void覆盖(自动映射)
    {
    mapping.HasMany(x=>x.Categories).KeyColumn(“ProductFk”).Table(“CategoriesProductsMap”).Element(“Category”).AsBag();
    }
    
    对我有效,但是枚举映射为int

    为了将其映射为字符串(我的首选项),我对映射进行了如下调整:

    public void Override(AutoMapping<Account> mapping)
    {
        mapping
            .HasMany(x => x.Categories)
            .Table("CategoriesProductsMap")
            .Element("Category", e => e.Type<NHibernate.Type.EnumStringType<Category>>())
            .AsSet();
    }
    
    public void覆盖(自动映射)
    {
    映射
    .HasMany(x=>x.Categories)
    .表格(“分类产品映射”)
    .Element(“Category”,e=>e.Type())
    .AsSet();
    }