Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 增加db4o中的对象数_Asp.net_Db4o - Fatal编程技术网

Asp.net 增加db4o中的对象数

Asp.net 增加db4o中的对象数,asp.net,db4o,Asp.net,Db4o,我想问你一个我遇到的问题。我使用ASP.NET作为接口,使用db4o作为数据库。我有这样的班级结构: Prj(类)(Eqp是Prj的一个属性) …Eqp(类)(Eqp的属性是以下两个:) …设备规范(等级) ..作业(属性) 我的代码在下面,我不明白为什么在我存储它之后EqpSpec中的对象增加了 如果在我关闭程序并重新打开它之后有一个“a”对象,我会从下拉列表中得到两个。(我从dropdownlist(ddlEqp)中选择EqpSpecName,之前我将对象存储在该列表中,然后我将

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

  • Prj(类)(Eqp是Prj的一个属性)
    • …Eqp(类)(Eqp的属性是以下两个:)
      • …设备规范(等级)
      • ..作业(属性)
我的代码在下面,我不明白为什么在我存储它之后EqpSpec中的对象增加了

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

/*我使用此方法添加*/
受保护的无效添加点击(对象发送方,事件参数e)
{  
// ...
EqpSpec objEqpS=新EqpSpec();
objEqpS.EqpName=ddlEqp.SelectedValue;
objEq.EqpSpec=(EqpSpec)db.Next(objEqpS);
objEq.Job=Convert.ToInt32(TxtJob.Text);
列表添加(对象);
会话[“ListQP”]=ListQP;
}
/*我将此方法用于更新和存储*/
受保护的无效更新\u单击(对象发送者,事件参数e)
{
DatabaseConnection db=新建DatabaseConnection();
ArrayList ListQP=(ArrayList)会话[“ListQP”];
Prj objPrj=新的Prj();
objPrj.PrjName=ddlPrj.SelectedValue;
objPrj=(Prj)db.Next(objPrj);
Eqp[]arrayEqp=新Eqp[listqp.Count];
for(int i=0;i

复制的原因是什么?我如何避免它?

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

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

db4o处理标识的方式是跟踪(引用)对象。只有当db4o对象容器处于打开状态且处于其上下文中时,才可能执行此操作。关闭对象容器、将对象移动到应用程序范围之外等将导致db4o无法跟踪该对象

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

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

 /* 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);
}