Fluent nhibernate FluentNHibernate:当一对多是一个简单枚举时,如何处理一对多值
以下情况似乎并不少见,但我不知道如何在FluenHibernate中处理它: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
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
,并将列表折叠为位掩码(这只需要一个整数列)产品
:
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();
}