我想问你一个我遇到的问题。我使用ASP.NET作为接口,使用db4o作为数据库。我有这个类结构:
我的代码在下面,我不明白为什么在我存储之后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);
}
重复的原因是什么,我该如何避免?
答案 0 :(得分:1)
听起来您正在数据库中创建重复的对象。这是一个常见问题(在Web场景中更为常见)。
首先要理解的是db中的对象标识与对象属性和值无关。因此,即使您通过new,clone,deserialization等创建具有相同值的对象,它也不是与原始对象相同的对象。存储此对象将在数据库中创建“重复”。
db4o处理身份的方式是它跟踪(引用)对象。只有在db4o对象容器处于打开状态并且位于其上下文中时,才可以执行此操作。关闭对象容器,移动应用程序范围之外的对象等将导致db4o失去对该对象的跟踪。
有两种常见的方法可以解决这个问题: a)每当需要更新对象时,从db加载对象,更改它的值并将其存储回来。 b)使用Bind方法告诉db4o您的当前对象与您希望在数据库中更新的对象相同。
有关更具体的建议,您需要分享有关您的应用程序的更多信息以及您希望实现的目标。