如何在没有数据库检索的情况下关联Session中的静态实体实例

时间:2010-02-22 20:31:07

标签: c# nhibernate

我有一个简单的Result类,它曾经是一个Enum,但已经发展成为拥有自己的表的自己的类。

public class Result {
    public static readonly Result Passed 
           = new Result(StatusType.Passed) { Id = [Predefined] };
    public static readonly Result NotRun 
           = new Result(StatusType.NotRun) { Id = [Predefined] };
    public static readonly Result Running
            = new Result(StatusType.Running) { Id = [Predefined] };
}

这些预定义值中的每一个在数据库中都有一行预定义的Guid Id。

然后有一个失败的结果,每个失败都有一个实例:

public class FailedResult : Result { 
  public FailedResult(string description) : base(StatusType.Failed) { . . . } 
}

然后我有一个具有结果的实体:

public class Task {
  public Result Result { get; set; }
}

当我保存任务时,如果结果是预定义的,我希望NHibernate知道它不需要将它保存到数据库,也不需要从数据库中获取它;我只想把它保存为Id。

我解决这个问题的方法是当我设置会话时,我调用一个方法来加载静态实体:

    protected override void OnSessionOpened(ISession session)
    {
        LockStaticResults(session, Result.Passed, Result.NotRun, Result.Running);
    }

    private static void LockStaticResults(ISession session, params Result[] results)
    {
        foreach (var result in results)
        {
            session.Load(result, result.Id);
        }
    }

session.Load方法调用的问题似乎是提取到数据库(我不想做的事情)。

我怎么能这样做才能获取数据库,但是相信我的静态(不可变)Result实例都是最新的并且是会话的一部分?

1 个答案:

答案 0 :(得分:1)

来自uNhAddIns的WellKnownInstanceType可能是您正在寻找的内容:http://code.google.com/p/unhaddins/source/browse/trunk/uNhAddIns/uNhAddIns/UserTypes/WellKnownInstanceType.cs