在db4o中增加对象编号

时间:2011-07-25 22:11:28

标签: asp.net db4o

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

  • Prj(Class)(Eqp是Prj的属性)
    • ... Eqp(Class)(Eqp的属性是这两个:)
      • .. EqpSpec(Class)
      • ..作业(属性)

我的代码在下面,我不明白为什么在我存储之后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);
}

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

1 个答案:

答案 0 :(得分:1)

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

首先要理解的是db中的对象标识与对象属性和值无关。因此,即使您通过new,clone,deserialization等创建具有相同值的对象,它也不是与原始对象相同的对象。存储此对象将在数据库中创建“重复”。

db4o处理身份的方式是它跟踪(引用)对象。只有在db4o对象容器处于打开状态并且位于其上下文中时,才可以执行此操作。关闭对象容器,移动应用程序范围之外的对象等将导致db4o失去对该对象的跟踪。

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

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