我有两个相似的表(Table1
,Table2
)所以我创建了一个具有公共属性的基本抽象类。每个表都有一列指示记录处理的状态。我想将这些列映射到一个枚举:
enum RecordStatus
{
UnkownStatus,
NotProcessed,
Processed,
}
不幸的是,对于每个表,我需要为枚举映射不同的值。
所以我创建了两个转换器(Table1StatusConverter
,Table2StatusConverter
),它继承自EnumType<RecordStatus>
并在映射中设置。它部分工作。部分原因是NHibernate在两个类中只使用一个转换器。
这个错误或者它是否像设计描述的那样工作?有没有解决方法呢?
编辑:我从内存中编写代码,因为我无权访问它
实体:
class abstract TableBase { public Guid Id { get; protected set; } public string Sender { get; protected set; } public DateTime ReceiveTime { get; protected set; } public RecordStatus Status { get; set; } } class Table1 : TableBase { public string Message { get; set; } } class Table2 : TableBase { public ICollection Parts { get; protected set; } }
转换器: Table1StatusConverter和Table2StatusConverter覆盖相同的方法,但方式不同。
class Table1StatusConverter : EnumType<RecordStatus> { public override object GetValue(object enumValue) { ... } public override object GetInstance(object value) { ... } }
映射:
Table1.hbm.xml <class name="Table1" table="Table1"> .. <property name="Status" type="MyAssembly.Table1StatusConverter, MyAssembly" /> .. </class> Table2.hbm.xml <class name="Table2" table="Table2"> .. <property name="Status" type="MyAssembly.Table2StatusConverter, MyAssembly" /> .. </class>
答案 0 :(得分:1)
这听起来不像是继承的好用。但是,您可以通过将枚举的整数值映射为基类中的受保护字段来完成此操作,并使用扩展类中的公共属性来转换为相应的枚举。
答案 1 :(得分:0)
您可能需要显式覆盖此属性吗?
class abstract TableBase
{
// ...
public virtual RecordStatus Status { get; set; }
}
class Table1 : TableBase
{
public string Message { get; set; }
public override RecordStatus Status { get; set; }
}
class Table2 : TableBase
{
public ICollection Parts { get; protected set; }
public override RecordStatus Status { get; set; }
}