NHibernate与petapoco加载机制
我很难理解NHibernate和petapoco加载机制。实际上,我做了一个测试来比较两者在查询时的行为 我的班级如下:NHibernate与petapoco加载机制,nhibernate,petapoco,Nhibernate,Petapoco,我很难理解NHibernate和petapoco加载机制。实际上,我做了一个测试来比较两者在查询时的行为 我的班级如下: UserTest.cs具有以下属性: private string name; private int id; private int customerId; public int ID { get { return id; } set { id = value; } } public string Name { get { return name
UserTest.cs
具有以下属性:
private string name;
private int id;
private int customerId;
public int ID
{
get { return id; }
set { id = value; }
}
public string Name
{
get { return name; }
set { name = value; }
}
public int? CustomerID
{
get { return customerId; }
set
{
if (value != customerId)
{
customerId = value;
if (this.ID > 0)
{
DoSomeOtherWork();
}
}
}
}
当我在NHibernate中执行User.Load
时,我注意到从未调用DoSomeOtherWork
,而在PetaPoco中,当我从加载User
执行查询时,例如Connection.db.Fetch(…)
或Connection.db.query(…)
,我可以看到调用了DoSomeOtherWork
为什么会这样
在使用PetaPoco时,有没有一种方法可以避免调用DoSomeOherWork
,从而使其具有与NHibernate相同的行为?我不想使用PetaPoco。忽略,因为我需要获取并设置
CustomerID`。PetaPoco它是一个微型ORM(比Nhibernate轻得多),并在获取记录时具体化POCO对象。没有什么比这更神奇的了,所以答案是:
不,您无法避免调用属性的setter。我只知道NHibernate,但是如果使用session.Get()的话,NHibernate只会进入数据库,而session.Load()会创建一个Id设置为的代理,并在以后访问属性/方法时获取实体。请注意,.Get可以返回null-.Load假设实体存在且从不为null,但在访问属性时,如果实体不存在,则将抛出。从@Goblin explain,我想问petaPOCO专家,petaPOCO中是否存在这种可能性,会话的解释是什么。Get()而session.Load()。我们是否有可能让方法分别执行与get和Load相同的工作?因为在我上面解释的情况下,很明显,在查询中访问实体非常重要:您的代码意味着属性值设置顺序。在代码的情况下,当您第一次设置
ID&CustomerID
时,与第一次设置CustomerID&ID
时,结果会有所不同。这是非常糟糕的,因为您的类有隐藏的议程,并且必须以正确的顺序正确使用。我在一个项目中工作过,该项目有几个god对象,这些对象在从数据库加载时依赖于setter的难以置信的复杂顺序,然后是一组完全不同的序列化行为。我打赌你可以想象这件事的可怕后果。我的严厉建议是,用于持久性和序列化的属性应尽可能简单和规范化。@learning:这适用于任何ORM。如果存在附加到特定属性的setter方法,则无法注入属性值。请理解,属性setter可以理解为使用一个值
参数调用的方法。