【问题标题】:Map generic class with Fluent NHibernate使用 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();
    }
} 

【问题讨论】:

    标签: generics fluent-nhibernate mapping


    【解决方案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");
        }
    }
    

    【讨论】:

    • 感谢您的回答。我的方向有点错误,试图使用泛型类作为基础
    猜你喜欢
    • 2011-03-02
    • 1970-01-01
    • 1970-01-01
    • 2015-05-23
    • 2011-04-10
    • 1970-01-01
    • 2010-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多