我刚刚开始使用.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;
}
}
在这种情况下,持久性逻辑有点复杂。我们希望保留私有的initialAmount
和hasBeenDoubledYet
字段;在重新实例化时,我们希望使用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角色的思考。
答案 0 :(得分:0)
我不知道EF,但是NHibernate需要你想要保持虚拟和公共的属性(正如你所说的代理原因)。