【发布时间】:2010-11-15 20:39:03
【问题描述】:
我想知道如何持久化依赖于常规持久化属性(例如字符串、int)以及它们自己的一些自定义转换的属性。
例如假设我有
class A
{
public int Id {get; set;}
public string SomeString {get; set;}
public object SpecialProperty {get; set;}
}
假设持久化 SpecialProperty 需要读取 SomeString 并根据它的值生成一些字节[],然后可以将其存储在数据库中。
我的第一个想法是使用 IUserType,但是这个方法 NullSafeGet(IDataReader rs, string[] names, object owner) 在 SomeString 被持久化(或不持久化)之前(或实际上,期间)被调用,所以它不是设置。
我的第二个想法是使用 ICompositeUserType 和一些使用包装器的相当复杂的设置。
我的第三个想法是也许我可以实现 ILifecycle 并挂钩 OnLoad() 方法。但是,如果我想这样做,我需要为我不想存储的 byte[] 有效负载创建一个单独的属性。这当然看起来最容易实现,但也有些不雅。
例如
class A : ILifecycle
{
public int Id {get; set;}
public string SomeString {get; set;}
public object SpecialProperty {get; set;}
private byte[] payloadData { get; set; }
public void OnLoad(ISession s, object id)
{
SpecialProperty = customIn(SomeString, payloadData);
payloadData = null;
}
static object customIn(string a, byte[] payload)
{
// ...
}
}
有没有人知道一种更简单且可能更简洁的方法?
【问题讨论】:
标签: nhibernate nhibernate-mapping