NHibernate - 检索数据库条目后执行步骤

时间:2016-08-02 18:28:00

标签: c# nhibernate fluent-nhibernate

我有一个附加了一些元数据的类。例如:

public class Parameter<T> : IParameter
{
    public string Id { get; set; }
    public T Value { get; set; }
    public List<IParameter> Metadata { get; set; }
}

我有另一个类,然后包含IList<IParameter>

public class Bar
{
    public IList<IParameter> Parameters { get; set; }
}

我有IUserType可以将某些类型存储为JSON(例如List<IParameter>)。我计划使用此存储Bar.Parameters,因此列值如下所示:

[
    {
        "id": "letter",
        "value": "a",
        "metadata": [
            "options": [ "a", "b", "c" ]
        ]
    },
    {
        "id": "cat.name",
        "value": "Mittens",
        "metadata": [
            "display_name": "Name"
        ]
    }
]

然而,我没有必要存储元数据,因为它在别处定义,可以使用Parameter.Id检索。我想改为存储一个映射其值的id数组:

[
    "letter": "a",
    "cat.name": "Mittens"
]

我知道如何以这种方式编写Parameters列,但我不确定如何在检索到元数据后让Bar检索元数据。

理想的是类似于WCF中的OnDeserialized属性。这允许我在Bar上定义一个方法,该方法在反序列化后调用:

public class Bar
{
    public string Type { get; set; }
    public IList<IParameter> Parameters { get; set; }

    [OnDeserialized]
    private void OnDeserialized(StreamingContext ctx)
    {
        // Extremely simplified example of how the Foo metadata may
        // be retrieved.
        foreach(var parameter in Parameters)
        {
            parameter.Metadata = BarMetadataStore.GetMetadata(Type, parameter.Id);
        }
    }
}

我想避免在Bar上手动调用函数来检索元数据,因为我的真实Bar是大类层次结构的一部分。当我检索拥有类时,NHibernate会自动检索Bar作为连接的一部分。

Bar执行“反序列化”步骤也很重要,因为其他类使用Parameter<T>类,可能会将元数据从不同的地方填充到Bar

我正在考虑使用IUserType加载NullSafeGet中的元数据,但GetMetadata依赖于Bar的另一个属性,我不知道如何在所有必要的地方获得这个价值。

简而言之:NHibernate / FluentNHibernate中有类似于[OnDeserialized]的内容吗?

1 个答案:

答案 0 :(得分:1)

我认为event listeners(更具体地说,IPostLoadEventListener)就是您所追求的目标。