【问题标题】:Why Id setter is protected in NHibernate base entity?为什么 Id setter 在 NHibernate 基础实体中受到保护?
【发布时间】:2016-07-17 13:08:06
【问题描述】:

在 NHibernate 基础实体中标记 Id setter 受保护的目的是什么?

public abstract class Entity<T>
{
    public virtual T Id { get; protected set; }
}

现在我想在我的服务层设置这个 Id,但由于它的访问级别,我无法设置,因为 setter 是 protected

我可以从我的设置器中删除“protected”修饰符吗?或者,如果我删除“protected”会违反任何规则吗?

【问题讨论】:

  • 您是否尝试将其设置为公开并查看会发生什么?
  • @Phill - 不,我还没有删除受保护的。首先我只想知道如果我删除受保护会有什么影响。
  • 试试吧。说真的,你是一个程序员,试试吧,发现,学习。
  • @Phill - 我当然是。但首先要了解我们在做什么以及为什么要这样做。
  • 另一点:NHibernate 没有“基本实体”——NHibernate 不提供这样的类。那是你的班级,你必须设计它以满足你的需要。

标签: c# nhibernate orm


【解决方案1】:

这样想:

拥有ID 足以获得实例。它在设计上是只读的,因为持久化的 (已存储) 实体可以刚刚接收,由 ORM 工具从 DB 加载。

而且获取此类实例的方法很少。这些方法又适合我们了 - 设计

1) session.Load&lt;TEntity&gt;(id) - 将返回一个代理,代表实例。在触及其任何属性之前,不会执行任何 DB 调用

2) session.Get&lt;TEntity&gt;(id) - 将立即调用 DB - 如果不存在传递 ID 的此类记录,则返回 NULL。如果有任何记录,则将其加载到会话中.. 准备进一步处理

更多细节:

NHibernate difference between Query<T>, Get<T> and Load<T>

【讨论】:

  • 我的问题还是一样。如何在我的服务层中设置此 Id 属性?有办法吗?
  • 是的,你可以。如果你喜欢那个.. 它是不被禁止的。使用这种方法,当您不首先从 DB 加载对象时...实际上您正在使用 Detached object,这绝对可以并受支持9.4.2. Updating detached objects ...所以更改您的ID 到 public.. 如果你愿意。但是如果你问“为什么只读”......我试图回答;)顺便说一句 - 我总是加载现有对象,并绑定到它......;)
  • 感谢您的详细解释。
  • 很高兴这能有所帮助 ;) 享受 NHibernate!
猜你喜欢
  • 2011-10-02
  • 1970-01-01
  • 2018-03-17
  • 1970-01-01
  • 1970-01-01
  • 2011-08-04
  • 2018-10-21
  • 1970-01-01
  • 2013-05-26
相关资源
最近更新 更多