1

私は Entify Framework を初めて使用するので、これはおそらく非常に基本的な質問です。WinForms アプリケーションでは、リストボックスを追加し、選択した内容でデータベースを更新しようとするまでは正常に動作するデータ入力ページがあります。

フォームで、ユーザーはアップロードするファイルを選択し、ファイルにアクセスできる 1 つ以上の部門を指定します。これが私がそれがうまくいくと思った方法です:

using (var ctx = new FCEntities())
{
  var batch = new Batch() { Description = txtDescription.Text, Filename = filename, Departments = (System.Data.Objects.DataClasses.EntityCollection<Department>)lstDepartments.SelectedItems };
  ctx.AddToBatches(batch);
  ctx.SaveChanges();
}

しかし、これがうまくいかなかったとき、私はいくつかの調査を行い、SelectedItems を EntityCollection にキャストできないことを知ったので、元のコレクションから新しいコレクションに項目をコピーし、次のように新しいコレクションを使用することにしました。

using (var ctx = new FCEntities())
{
  var departments = new System.Data.Objects.DataClasses.EntityCollection<Department>();

  foreach (var department in lstDepartments.SelectedItems)
  {
    departments.Add((Department)department);
  }

  var batch = new Batch() {Description = txtDescription.Text, Filename = filename, Departments=departments };
  ctx.AddToBatches(batch);
      ctx.SaveChanges();

}

これも機能せず、部門でこのエラーが発生しました。行を追加:

「ObjectContext にアタッチされているオブジェクトは、ソース オブジェクトに関連付けられていない EntityCollection または EntityReference に追加できません。」

部門オブジェクトが ObjectContext に関連付けられているように見えないのでわかりませんか? 私は明らかに基本的なものを欠いているので、アドバイスや他の人がこれをどのように行っているかの例へのリンクをいただければ幸いです。

4

1 に答える 1

1

誰かがいつかこれに遭遇した場合に備えて、私はこれに対する答えを残したかった。Wiktorが残したコメントは、私を正しい方向に導くのに役立ちました。基本的な理解が不足していると判断したので、MSDNを読んで、問題を解決することができました。

この背後にあるデータモデルは、Batches、Departments、およびBatches_Departmentsの3つのテーブルで構成されていました。これにより、BatchesとDepartmentsの間の多対多の関係が可能になりました。

私の元のコード/ロジックの問題は、一言で言えば、リストボックス内のDepartmentオブジェクトが、Saveメソッドで使用していたものとは異なるコンテキストに関連付けられていたことです。EFは明らかな理由でこれを好まなかったので(少なくとも今は明らかです)、saveメソッドでは、選択した部門のIDを使用して、現在のコンテキストで同じ部門への参照を取得しました。次に、この部門を新しく作成したバッチに追加できます。

コードは次のようになります。

using (var ctx = new FCEntities())
{
  var batch = new Batch() { Description = txtDescription.Text, Filename = filename};

  foreach (var department in lstDepartments.CheckedItems)
  {
    var dept = (from d in ctx.Departments where d.DepartmentID == ((Department)department).DepartmentID select d).First();
    batch.Departments.Add(dept);
  }

  ctx.Batches.AddObject(batch);
  ctx.SaveChanges();
}

うまくいけば、これは同じ問題を扱っている他の誰かを助けるでしょう。

于 2012-06-27T12:47:23.610 に答える