Карта общего класса с 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.