【问题标题】:NHibernate and overridden propertiesNHibernate 和覆盖的属性
【发布时间】:2010-02-04 21:50:29
【问题描述】:

首先让我说我是 nHibernate 的新手,所以如果这个问题的答案很明显,请原谅我。 我有一个抽象基类,它的所有成员都是抽象的。

public abstract class BallBase
{
  public abstract RunsScored { get; }
  public abstract IsOut { get; }
  public abstract IsExtra { get; }
  public abstract GetIncrement();

}

以及像

这样的具体实现
public class WideBall : BallBase
{
  public override RunsScored
  {
    private int m_RunsScored = 1;

    public WideBall(): base()
    { }

    public WideBall(int runsScored) : base()
    {
        m_RunsScored = runsScored;
    }

    public  override int RunsScored
    {
        get
        {
            return m_RunsScored;
        }
    }

    public  override bool IsOut
    {
        get
        {
            return false;
        }
    }

    public  override bool IsExtra
    {
        get
        {
            return true;
        }
    }

    public  override int GetIncrement()
    {
        // add 0 to the balls bowled in the current over
        // a wide does not get added to the balls bowled
        return 0;
    }

  }

}

我想使用 nHibernate 来持久化具体类,但显然该类的所有公共成员都需要是虚拟的。 有什么办法可以继续我的基类方法吗?

【问题讨论】:

    标签: c# nhibernate


    【解决方案1】:

    查看 C# 文档,这些属性是虚拟的。你不需要做任何特别的事情,你可以继续。

    【讨论】:

      【解决方案2】:

      如果你想利用 NHibernates 的能力来实现延迟加载是正确的,那么你需要将公共成员设为虚拟。

      您可以做的是在类标签中设置属性lazy=false,如果您想要任何特定成员(通常是包、列表等)惰性,则将该成员的惰性属性设置为lazy=true并使其对应的成员虚拟的。

      我已经用这种方式处理过很多次了,没问题。

      【讨论】:

        【解决方案3】:

        是的,但具体取决于您喜欢如何设置数据库架构。看看section 8 in the NHibernate documentation。我们使用的是<joined-subclass>,它为我们节省了大量代码。

        如果你不想,你不必使用延迟加载。要为您的映射类关闭延迟加载,您可以将lazy="false" 添加到您的类映射(.hbm.xml 文件)中。

        顺便说一句,我假设您有一个特定的原因使用纯抽象基类而不是接口?

        【讨论】:

        • 他能够使用延迟加载,因为抽象在 C# 中也意味着虚拟
        • 谢谢 Paco,我想知道 nhibernate 是否认为抽象和虚拟是一样的
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-08
        • 1970-01-01
        • 2013-07-19
        • 2011-07-06
        • 1970-01-01
        相关资源
        最近更新 更多