Карта общего класса с Fluent NHibernate

Я читал http://******.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();
 }
} 
</t>
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");
 }
}
</componentfield></primitivefield<string></primitivefield<int></field></t>

licensed under cc by-sa 3.0 with attribution.