2011-07-25 21 views
0

私はあなたに問題があるかどうか質問したいと思います。私はインターフェイスとしてASP.NETを使用し、db4oはデータベースとして使用します。私は、このクラス構造を持っている:db4oのオブジェクト番号を増やす

  • PRJ(クラス)(EQPがPRJの属性である)
    • ... EQP(クラス)(EQPの属性は、これらの2つです:)
      • 。 .EqpSpec(クラス)
      • ..Job(属性)

私のコードは以下の通りですが、EqpSpecのオブジェクトを格納した後になぜそれが増えたのか分かりません。

プログラムを閉じてからもう一度「a」オブジェクトを作成し、それを再び開くと、ドロップダウンリストから2つが得られます。 (私はドロップダウンリスト(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

データベースに重複したオブジェクトを作成しているようです。これは一般的な問題です(Webシナリオではさらに一般的です)。

最初に理解しておきたいことは、dbのオブジェクトIDはオブジェクトのプロパティと値とは関係がないことです。したがって、同じ値を持つオブジェクトを新規作成、複製、逆シリアル化などで作成しても、元のオブジェクトと同じオブジェクトではありません。このオブジェクトを保存すると、データベースに「重複」が作成されます。

db4oがアイデンティティを処理する方法は、オブジェクトの追跡(参照)を維持することです。これは、db4oオブジェクトコンテナが開いていて、そのコンテキスト内にいる場合にのみ可能です。オブジェクトコンテナを閉じたり、アプリケーションのスコープ外にオブジェクトを移動させると、db4oはそのオブジェクトのトラックを失います。

この問題を処理する一般的な方法は2つあります。 a)オブジェクトをdbからロードする必要がある場合は、その値を変更して元に戻します。 b)Bindメソッドを使用して、現在のオブジェクトがdbで更新するオブジェクトと同じであることをdb4oに伝えます。

もっと具体的なアドバイスを行うには、アプリケーションに関する詳細と達成したいことを明確に伝える必要があります。

関連する問題