увеличение номера объекта в db4o - PullRequest
0 голосов
/ 26 июля 2011

Я хотел бы спросить вас о проблеме, которая у меня есть. Я использую ASP.NET в качестве интерфейса и db4o в качестве базы данных. У меня есть такая структура класса:

  • Prj (Класс) (Eqp является атрибутом Prj)
    • ... Eqp (Класс) (атрибуты Eqp - это два :)
      • .. EqpSpec (Класс)
      • .. Работа (атрибут)

Мой код приведен ниже, и я не понимаю, почему после того, как я его сохранил, объекты в EqpSpec увеличились.

Если после закрытия программы и повторного ее открытия у меня есть объект "a", я получаю два из выпадающего списка. (Я выбираю EqpSpecName из выпадающего списка (ddlEqp), в котором я ранее сохранял объекты, и я записываю задание в 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 Ответ

1 голос
/ 16 октября 2011

Похоже, вы создаете дубликаты объектов в вашей базе данных. Это распространенная проблема (даже более распространенная в веб-сценариях).

Первое, что нужно понять, это то, что идентичность объекта в БД не имеет ничего общего со свойствами и значениями объекта. Таким образом, даже если вы создаете объект с теми же значениями, с помощью new, clone, десериализации и т. Д., Это не тот же объект, что и оригинал. Хранение этого объекта создаст «дубликаты» в вашей базе данных.

Способ, которым db4o работает с идентичностью, заключается в том, что он отслеживает (ссылки) объектов. Это возможно только в том случае, если ваш контейнер объектов db4o открыт и вы находитесь в его контексте. Закрытие контейнера объектов, перемещение объектов вне области вашего приложения и т. Д. Приведет к потере db4o этого объекта.

Существует два распространенных способа решения этой проблемы: а) Всякий раз, когда вам нужно обновить объект, вы загружаете объект из БД, измените его значение и сохраните его обратно. b) Используйте метод Bind, чтобы сообщить db4o, что ваш текущий объект совпадает с объектом, который вы хотите обновить в своей базе данных.

Чтобы получить более конкретный совет, вам необходимо поделиться дополнительной информацией о вашем приложении и о том, чего именно вы хотите достичь.

...