使用 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 映射类层次结构

Fluent Nhibernate 映射多重连接

使用自动映射时如何使用 Fluent NHibernate Validator?

Fluent Nhibernate将集合映射到通用实体

Fluent NHibernate:如何将整个类映射为只读?