使用Fluent NHibernate映射泛型类



我读过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");
    }
}

最新更新