我有一个包含一些列的日期表: INTEGER_VALUE,DOUBLE_VALUE,STRING_VALUE,DATETIME_VALUE
一个对象是:
public class Property
{
public virtual int Id { set; get; }
public virtual PropertyKind Kind { set; get; }
public virtual object Value { set; get; }
public PropertyValueType ValueType { set; get; }
}
PropertyValueType
是:
public enum PropertyValueType
{
TypeInt,
TypeString,
TypeDouble,
TypeDateTime
}
目标是将Value
映射到Database(firebird)条件的不同列到ValueType。例如,如果ValueType
是TypeString
,我们需要将它映射到STRING_VALUE列等。ValueType
设置对象开始创建时(在构造函数中)并且永远不会更改。
可能吗?或者可能是另一种解决方案?
答案 0 :(得分:2)
NHibernate可以帮助我们将表映射到C#对象/实体(ORM)。这意味着:
我们应该正确地将所有表的列映射到所有C#实体属性中。
稍后(例如,业务层或get
和set
)内部,我们应该应用一些验证规则来实现所需的行为。此外,我们应该扩展应用程序层,以确保对于每种枚举PropertyValueType
,正确的属性被填充,并将保留在正确的列中。 < / p>
所以对象结构可能就像这样
public class Property
{
public virtual int Id { set; get; }
public virtual PropertyKind Kind { set; get; }
public PropertyValueType ValueType { set; get; }
// not mapped
public virtual object Value { ... some logic inside of the getter and setter }
// mapped properties - could be protected and hidden from upper consumers
protected virtual int? IntValue { get; set;}
protected virtual string StringValue { get; set;}
protected virtual double? DoubleValue { get; set;}
protected virtual DateTime? DateTimeValue { get; set;}
}
因此,NHibernate将帮助我们以1:1的方式映射列和属性。剩下的处理由我们的申请决定。
最后这将带给我们很多,因为我们甚至可以在所有行中发出OrderBy
,而只有其中一些确实填充了列...