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

时间:2010-08-31 23:53:45

标签: fluent-nhibernate

看起来下面的场景不应该是不常见的,但我无法弄清楚如何在FluenNHibernate中处理它:

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,
    ...
}

所以,我需要一个ProductCategories表,允许我将一个产品映射到多个类别,但我不认为NHibernate会处理这个,除非我有一个实际的Categories类和一个具有多对多关系的Categories表指定。有许多原因这是不可取的,其中最重要的原因是它太过分了。

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

谢谢!

4 个答案:

答案 0 :(得分:4)

This accepted answer为我工作,但是enum被映射为int。

为了让它以字符串形式映射(我的偏好),我按如下方式调整了映射:

public void Override(AutoMapping<Account> mapping)
{
    mapping
        .HasMany(x => x.Categories)
        .Table("CategoriesProductsMap")
        .Element("Category", e => e.Type<NHibernate.Type.EnumStringType<Category>>())
        .AsSet();
}

答案 1 :(得分:2)

我曾尝试过像这样的另一个实例中的连接字符串,但我真的想要一些每次都不需要转换的东西。事实证明,我在这里发现了一个非常相似的问题:Map to a list of Enums?。如上所述,此覆盖有效:

public void Override(AutoMapping<Product> mapping)
{
     mapping.HasMany(x => x.Categories).KeyColumn("ProductFk").Table("CategoriesProductsMap").Element("Category").AsBag();
}

答案 2 :(得分:0)

有几种方法可以做到这一点,它们都没有你想象的那么简单。虽然NHibernate和Fluent NHibernate使用单个enum做得很好,但是集合更加麻烦。

以下是两种方法:

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

    您必须明确地映射Product

    public class ProductMap : ClassMap<Product>
    {
        public ProductMap()
        {
            Id(x => x.Id);
    
            Map(Reveal.Member<Product>("_categories"))
                .Access.Field();
        }
    }
    

    因此虽然Product公开IList<Category>,但NHibernate只会获取并设置_categories字段的值;

答案 3 :(得分:0)

在工作中,虽然它与枚举值的集合无关,但我们创建了一个自定义类型(通过实施IUserType来存储IDictionary<CultureInfo, string>

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

有关实施IUserType的信息,您可以看到this site