使用 Fluent NHibernate 映射泛型类
Posted
技术标签:
【中文标题】使用 Fluent NHibernate 映射泛型类【英文标题】:Map generic class with Fluent NHibernate 【发布时间】:2014-12-09 05:16:43 【问题描述】:我已经阅读了http://ayende.com/blog/2951/nhibernate-and-generic-entities,现在有一个问题是否可以(如果可能的话,如何)在我的代码中使用流利的 NHibernate 映射泛型类:
public interface IEntity
int Id get; set;
public class FieldEntity<T> : IEntity
public int Id get; set;
public virtual string FieldType get; set;
public virtual string FieldValue get; set;
public virtual bool IsDeleted get; set;
public FieldEntity(T value)
FieldType = typeof (T).ToString();
FieldValue = value.ToString();
public FieldEntity()
FieldType = typeof(T).ToString();
【问题讨论】:
【参考方案1】:这是可能的,但您必须自己映射每个通用参数。所以重构你的例子:
public abstract class Field : IEntity
public int Id get; set;
public virtual bool IsDeleted get; set;
public abstract string ValueAsString get; set;
public class PrimitiveField<T> : Field
public virtual T Value get; set;
public override string ValueAsString
get return Convert.ToString(CultureInfo.InvariantCultuere);
set Value = Convert.ChangeType(value, typeof(T), CultureInfo.InvariantCultuere);
public class ComponentField : Field
public virtual Component Value get; set;
public override string ValueAsString
get return Value.ToString();
set Value = Component.Parse(value);
public class FieldMap : ClassMap<Field>
public FieldMap()
Id(x => x.Id).GeneratedBy.Whatever();
Map(x => x.IsDeleted);
Map(x => x.ValueAsString, "FieldValue");
DiscriminateSubClassesOnColumn("FieldType");
public class IntFieldMap : SubclassMap<PrimitiveField<int>>
public IntFieldMap()
DiscriminatorValue("Int32");
public class StringFieldMap : SubclassMap<PrimitiveField<string>>
public StringFieldMap()
DiscriminatorValue("String");
public class ComponentFieldMap : SubclassMap<ComponentField>
public ComponentFieldMap()
DiscriminatorValue("Component");
【讨论】:
感谢您的回答。我的方向有点错误,试图使用泛型类作为基础以上是关于使用 Fluent NHibernate 映射泛型类的主要内容,如果未能解决你的问题,请参考以下文章
使用 Fluent NHibernate 和 NHibernate 3 将枚举映射为 Int
使用 2 种策略通过 fluent nhibernate 映射类层次结构