Fluent Nhibernate按条件映射到不同的列

时间:2014-06-22 06:29:51

标签: c# nhibernate fluent-nhibernate firebird

我有一个包含一些列的日期表: 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。例如,如果ValueTypeTypeString,我们需要将它映射到STRING_VALUE列等。ValueType设置对象开始创建时(在构造函数中)并且永​​远不会更改。 可能吗?或者可能是另一种解决方案?

1 个答案:

答案 0 :(得分:2)

NHibernate可以帮助我们将表映射到C#对象/实体ORM。这意味着:

  

我们应该正确地将所有表的列映射到所有C#实体属性中。

稍后(例如,业务层或getset内部,我们应该应用一些验证规则来实现所需的行为。此外,我们应该扩展应用程序层,以确保对于每种枚举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,而只有其中一些确实填充了列...