2011-07-25 51 views
0

我想問你一個問題,我有。我使用ASP.NET作爲接口,使用db4o作爲數據庫。我有這樣的階級結構:在db4o中增加對象編號

  • PRJ(類)(EQP是PRJ的屬性)
    • ... EQP(類)(EQP的屬性是這兩個:)
      • 。 .EqpSpec(類)
      • ..Job(屬性)

我的代碼在下面,我不明白爲什麼在我存儲它後,EqpSpec中的對象增加了。

如果在關閉程序並重新打開它之後我有一個「a」對象,我會從下拉列表中獲得兩個對象。 (我從之前存儲對象的下拉列表(ddlEqp)中選擇EqpSpecName,然後將作業寫入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

這聽起來像你正在你的數據庫中創建重複的對象。這是一個常見問題(在網絡場景中更常見)。

首先要理解的是,db中的對象標識與對象屬性和值無關。所以即使你使用相同的值創建一個對象,無論是通過新的,克隆,反序列化等,它都不是原來的對象。存儲這個對象將在你的數據庫中創建「重複」。

db4o處理身份的方式是跟蹤(引用)對象。這隻有在您的db4o對象容器處於打開狀態且您處於上下文範圍內時纔有可能。關閉對象容器,將對象移動到應用程序的範圍之外等將導致db4o失去對該對象的跟蹤。

有兩種常見的方法來處理這個問題: a)當你需要更新一個對象時,你從db中加載對象,改變它的值並將其存回。 b)使用Bind方法告訴db4o你當前的對象與你希望在db中更新的對象是一樣的。

有關更具體的建議,您需要共享有關您的應用程序的更多信息以及您希望達到的目標。