我读过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();
}
}
这是可能的,但您必须自己映射所需的每个通用参数。因此,重构您的示例:
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");
}
}