.NET ORM和持久的非属性状态

时间:2011-03-19 20:35:35

标签: .net orm properties class-design private-members

我刚刚开始使用.NET ORM,我还没有在Entity Framework和NHibernate之间做出决定。但在这两种情况下,我遇到了一个问题,因为他们似乎希望我以各种方式设计我的课程,看起来不自然。这是关于这个问题的几个问题之一。


示例类:

public class Pledge // this is an entity BTW, not a value object
{
    private readonly int initialAmount;
    private bool hasBeenDoubledYet;

    public Pledge(int initialAmount)
    {
        this.initialAmount = initialAmount;
    }

    public int GetCurrentAmount()
    {
        return this.hasBeenDoubledYet ? this.initialAmount * 2 : this.initialAmount;
    }
    public void Double()
    {
        this.hasBeenDoubledYet = true;
    }
}

在这种情况下,持久性逻辑有点复杂。我们希望保留私有的initialAmounthasBeenDoubledYet字段;在重新实例化时,我们希望使用initialAmount调用构造函数,如果Double()字段为hasBeenDoubledYet则调用true。这显然是我必须编写一些代码的东西。

另一方面,根据我的理解,典型的“ORM友好”版本的代码可能最终看起来更像这样:

public class Pledge
{
    // These are properties for persistence reasons
    private int InitialAmount { get; set; }  // only set in the constructor or if you are an ORM
    private bool HasBeenDoubledYet { get; set; }

    private Pledge() { } // for persistence
    public Pledge(int initialAmount) { /* as before but with properties */ }

    public int GetCurrentAmount() { /* as before but with properties */ }
    public int Double() { /* as before but with properties */ }
}

我在another post中涵盖了对默认构造函数和只读字段等的保留,但我想这个问题实际上是关于如何让ORM处理私有字段而不是私有属性 - 可以这样做吗?在EF?在NHibernate?我们无法为代理目的标记字段virtual ...会标记使用它们的方法virtual是否足够?


这一切都让人感到非常hacky :(。我希望这里的某个人可以指出我的错误,无论是掌握他们的能力还是我对域建模和ORM角色的思考。

1 个答案:

答案 0 :(得分:0)

我不知道EF,但是NHibernate需要你想要保持虚拟和公共的属性(正如你所说的代理原因)。