1

サイトとリンクの2つのモデルがあり、サイトに多くのリンクがある場合、オブジェクトコンテキストにアクセスできないサイトのメソッド内からリンクを削除するにはどうすればよいですか?

私は次のようなことを試しました:

public void DeleteFirstLink() {
    var link = LinkSet.First();
    LinkSet.Remove(link);
}

しかし、それは実際にはリンクを削除しているのではなく、関連付けを壊しているようです。データベースの制約があるため、次のエラーがスローされます。

リレーションシップは、AssociationSet'Sites_have_Links'から追加または削除されています。カーディナリティの制約がある場合、対応する「リンク」も追加または削除する必要があります。

データベースからリンクを実際に削除するにはどうすればよいですか?

4

4 に答える 4

1

DeleteFirstLink() メソッドを呼び出したときに ObjectContext がアクティブでないと仮定すると、メソッド内でコンテキストをスピンアップし、Site エンティティをアタッチしてからリンクを削除することで機能させることができます。

public void DeleteFirstLink()
{
  using (ProjectEntities db = new ProjectEntities())
  {
    db.AttachTo("[your site EntitySet name - SiteSet?]", this);
    var link = LinkSet.First();
    db.DeleteObject(link);
    LinkSet.Remove(link);
    db.SaveChanges();
  }
}
于 2010-01-20T12:30:45.083 に答える
0
  1. 変更がデータベースに反映されるようにエンティティを操作するには、オブジェクトコンテキストでこれらのエンティティを追加/アタッチし(データベースコンテキストのEF5に関して)、メソッドSaveChangesを使用して変更をコミットする必要があります。

  2. はい、EF4で物理SQLテーブル(リンクではない)からレコードを削除するには、オブジェクトObjectContextのメソッドDeleteObjectを使用してから、SaveChangesを使用する必要があります。

    using(ObjectContext context = new ObjectContext)
    {
        /* Find the removed record in object/database context (this will attaches 
         * the record to object/database context)
         * It is recommened to use FirstOrDefault() instead of First() 
         * becase this method can return null if there is no record to delete
         * instead generation of exception in case of using First()
         */
        Link linkToDelete = context.Links.FirstOrDefault(); 
        if(linkToDelete != null) 
        {
            context.DeleteObject(linkToDelete);
            context.SaveChanges();
        }
    }
    
  3. 幸いなことに、関係が1対多の場合にのみ、親コレクションから削除できるEF5があります。

    using(DatabaseContext context = new DatabaseContext)
    {
        Link linkToDelete = context.Links.FirstOrDefault(); 
        if(linkToDelete != null)
        {
            context.Links.Remove(linkToDelete);
            context.SaveChanges();
        }
    }
    
  4. いずれにせよ、SaveChangesを呼び出すことを忘れないでください!
于 2012-09-24T07:00:57.787 に答える
0

オブジェクト コンテキストがなければ、データベースから何も削除できません。すべてのアクションは、オブジェクト コンテキストの状態マネージャーのキューに入れられ、 を呼び出すとデータベースに保持されますObjectContext.SaveChanges()。SaveChanges がなければ、DB は変更されません。

于 2010-01-19T23:44:46.420 に答える
0

まず、クラス構造についてもう少し情報を投稿していただければ幸いです。Site クラスには ObjectContext オブジェクトがありますか? 次に、簡単な解決策として、それを delete メソッドに渡して context.DeleteObject() メソッドを使用し、後で SaveChanges を呼び出すことができます。

ただし、長期的な解決策として、引き続き UnitOfWork パターンを使用することをお勧めし、それを説明する記事へのリンクをもう一度投稿します。実装は異なる場合がありますが、一般的にはほとんどの問題を解決する可能性があります (これと同様)。

このアプローチの優れた点は、正しく使用すれば小さなフレームワークを構築でき、後でそれをすべての EF プロジェクトで再利用できることです。

于 2010-01-20T10:38:15.340 に答える