【问题标题】:increasing object numbers in db4o增加 db4o 中的对象数量
【发布时间】:2011-07-25 22:11:27
【问题描述】:

我想问你一个我遇到的问题。我使用 ASP.NET 作为接口,使用 db4o 作为数据库。我有这个类结构:

  • Prj(Class)(Eqp 是 Prj 的一个属性)
    • ...Eqp(Class)(Eqp的属性就是这两个:)
      • ..EqpSpec(类)
      • ..工作(属性)

我的代码在下面,我不明白为什么在我存储它之后,EqpSpec 中的对象增加了。

如果我在关闭程序并重新打开它后有一个“a”对象,我会从下拉列表中得到两个。 (我从下拉列表(ddlEqp)中选择 EqpSpecName,我之前在其中存储了对象,然后将 Job 写入 TxtJob,我首先将它存储到 AddEqp 中的数组中。然后我从会话中取出它并将其存储到数据库中在 Update_Click 中。)

 /* I use this method to add */
protected void AddEqp_Click(object sender, EventArgs e)
{  
     // ...

     EqpSpec objEqpS = new EqpSpec();
     objEqpS.EqpName = ddlEqp.SelectedValue;
     objEq.EqpSpec = (EqpSpec)db.Next(objEqpS);
     objEq.Job = Convert.ToInt32(TxtJob.Text);
     listEqp.Add(objEq);
     Session["listEqp"] = listEqp;
}

 /*  I use this method for both update and store */
protected void Update_Click(object sender, EventArgs e)
{
    DatabaseConnection db = new DatabaseConnection();
    ArrayList listEqp = (ArrayList)Session["listEqp"];
    Prj objPrj= new Prj();
    objPrj.PrjName = ddlPrj.SelectedValue;
    objPrj = (Prj)db.Next(objPrj);      
    Eqp[] arrayEqp = new Eqp[listEqp.Count];
    for (int i = 0; i < listEqp.Count; i++)
       arrayEqp = (Eqp)listEqp;
    objPrj.Eqp = arrayEqp;
    db.Update(objPrj);
}

重复的原因是什么,如何避免?

【问题讨论】:

    标签: asp.net db4o


    【解决方案1】:

    听起来您正在数据库中创建重复的对象。这是一个常见问题(在网络场景中更常见)。

    首先要了解的是,db 中的对象标识与对象属性和值无关。因此,即使您通过新建、克隆、反序列化等创建具有相同值的对象,它也与原始对象不同。存储此对象将在您的数据库中创建“重复”。

    db4o 处理身份的方式是跟踪(引用)对象。只有当您的 db4o 对象容器打开并且您在其上下文中时,这才有可能。关闭对象容器、将对象移动到应用程序范围之外等都会导致 db4o 失去对该对象的跟踪。

    有两种常见的方法来处理这个问题: a) 每当您需要更新从数据库加载对象的对象时,更改它的值并将其存储回来。 b) 使用 Bind 方法告诉 db4o 您当前的对象与您希望在 db 中更新的对象相同。

    如需更具体的建议,您需要分享有关您的应用程序以及您希望达到的具体目标的更多信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-11
      • 2021-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多