处理 NHibernate 加载失败

发布于 2024-11-06 02:42:44 字数 369 浏览 0 评论 0原文

我有以下方法。

    public Foo GetById(int id)
    {
        ISession session = GetCurrentSession();
        try
        {
            return session.Load<Foo>(id);
        }
        catch(NHibernate.ObjectNotFoundException onfe)
        {
            throw(onfe);
        }
    }

不幸的是,onfe 永远不会被抛出。我想处理我只得到的案件 返回代理,因为数据库中不存在足够的行。

I have the following method.

    public Foo GetById(int id)
    {
        ISession session = GetCurrentSession();
        try
        {
            return session.Load<Foo>(id);
        }
        catch(NHibernate.ObjectNotFoundException onfe)
        {
            throw(onfe);
        }
    }

Unfortunately, onfe is never thrown. I want to handle the case that I only get
back a proxy because no adequate row exists in database.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

千秋岁 2024-11-13 02:42:44

我建议您编写自己的 ObjectNotFoundException 并将该方法重写为:

public Foo GetById(int id)
{
    Foo foo;
    ISession session = GetCurrentSession();
    foo = session.Get<Foo>(id);
    if (foo == null)
    {
        throw new ObjectNotFoundException(string.Format("Foo with id '{0}' not found.", id));
    }
}

您所编写的方法有两个问题:

  1. 您应该使用 Get 通过实体的键加载实体。
  2. 您的异常处理是包装原始异常并无缘无故地重新抛出。

I suggest you write your own ObjectNotFoundException and rewrite the method as:

public Foo GetById(int id)
{
    Foo foo;
    ISession session = GetCurrentSession();
    foo = session.Get<Foo>(id);
    if (foo == null)
    {
        throw new ObjectNotFoundException(string.Format("Foo with id '{0}' not found.", id));
    }
}

There are two problems with your method as written:

  1. You should use Get to load an entity by its key.
  2. Your exception handling is wrapping the original exception and re-throwing for no reason.
叶落知秋 2024-11-13 02:42:44

如果允许实体延迟加载,则 Load 方法返回未初始化的代理。一旦代理即将初始化,就会抛出 ObjectNotFoundException。

当您不确定所请求的实体是否存在时,应首选 Get 方法。

看:
Nhibernate 错误:没有找到具有给定标识符的行错误
,
https://sites.google。 com/a/thedevinfo.com/thedevinfo/Home/or-persistence/hibernate/hibernate-faq 等...

If an entity is allowed to be lazy-loaded then Load method returns uninitialized proxy. The ObjectNotFoundException is thrown as soon as the proxy is about to be initialized.

Get method should be prefered when you are not sure that a requested entity exists.

See:
Nhibernate error: NO row with given identifier found error
,
https://sites.google.com/a/thedevinfo.com/thedevinfo/Home/or-persistence/hibernate/hibernate-faq, etc...

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文