看起来下面的场景不应该是不常见的,但我无法弄清楚如何在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 - 我可以覆盖任何方式使其工作吗?
谢谢!
答案 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
做得很好,但是集合更加麻烦。
以下是两种方法:
nvarchar(?)
列。enum
属性标记Flags
并将列表折叠为位掩码(这只需要一个整数列)在任何一种情况下,您都可以让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。