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

我很难理解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; }
    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可以理解为使用一个
参数调用的方法。