Asp.net 增加db4o中的对象数
我想问你一个我遇到的问题。我使用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,之前我将对象存储在该列表中,然后我将
- Prj(类)(Eqp是Prj的一个属性)
- …Eqp(类)(Eqp的属性是以下两个:)
- …设备规范(等级)
- ..作业(属性)
- …Eqp(类)(Eqp的属性是以下两个:)
/*我使用此方法添加*/
受保护的无效添加点击(对象发送方,事件参数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);
}