0

私はEntityFramework4.1でデータベースファーストアプローチに取り組んでいます。私は2つの多対多の関連エンティティBookとLibraryを持っています。また、BOOKエンティティとLIBRARYエンティティの両方と1対多の関係を持つ、ライブラリ内の本の特定のコピーに関する情報を格納するための10列のジャンクションテーブルが1つあります。BookVieMOdelの定義に一致する子オブジェクトを含むJSONオブジェクトを送信するビューを作成しました。ビューは正常に機能していますが、コントローラーのジャンクションテーブルに新しいエントリを追加するのに問題があります。「削除済み状態のエンティティとの関係の追加は許可されていません」というエラーが表示されます。エラーは、削除されたオブジェクトを参照しているbook.LibraryBookCopies.Clear();と思いますが、他の方法でそれを行うことは考えられません。

ありがとう、

コントローラ:

[HttpPost]
    public ActionResult Edit(BookViewModel bookv)
    {

        Mapper.CreateMap< BookViewModel,Book>();

        Book  book = Mapper.Map<BookViewModel,Book>(bookv);

        db.Books.Attach(book);

        db.ObjectStateManager.ChangeObjectState(book, EntityState.Modified);

        //Add library ref to each libraryBookCopies object in Book
        foreach (LibraryBookCopy lBC in book.LibraryBookCopies)
        {
            lBC.Library = db.Libraries.Single(l => l.LibraryId == lBC.LibraryId);
        }

        //Remove all currently related records
        book.LibraryBookCopies.Clear();

        //Add copies from ViewModel to book object
        foreach (LibraryBookCopy lBC in bookv.LibraryBookCopies)
        {      book.LibraryBookCopies.Add(lBC); //Error here      }

        db.SaveChanges();

        return RedirectToAction("Index");     
    }
4

3 に答える 3

2

エラーは「削除済みの状態にあるエンティティは許可されていません」とおっしゃっていましたが、WillCascadeOnDeleteに問題があり、ブックが削除されているのではないかと思います。http://weblogs.asp.net/manavi/archive/2011/01/23/associations-in-ef-code-first-ctp5-part-3-one-to-one-foreign-key-associationsを参照して ください。 aspx

于 2012-08-29T17:28:09.087 に答える
0
 [HttpPost]
        public ActionResult Edit(BookViewModel bookv)
        {
            //create maps
            Mapper.CreateMap<LibraryBookCopyViewModel, LibraryBookCopy>();
            Mapper.CreateMap<BookViewModel, Book>();

            //convert view objects to model objects
            Book book = Mapper.Map<BookViewModel, Book>(bookv);

            List<LibraryBookCopy> bookCopiesFromView = Mapper.Map<List<LibraryBookCopyViewModel>, List<LibraryBookCopy>>(bookv.LibraryBookCopies);

            List<LibraryBookCopy> toBeDeletedLibraryBookCopies = new List<LibraryBookCopy>();

            //this has to be executed before db.Books.Attach
            book.LibraryBookCopies.Clear();

            //Add or update book copies
            foreach (LibraryBookCopy bc in bookCopiesFromView)
            {
                if (bc.LibraryBookCopyId != 0)
                {
                    db.LibraryBookCopies.Attach(bc);
                    db.ObjectStateManager.ChangeObjectState(bc, EntityState.Modified);
                }
                else
                {

                    db.LibraryBookCopies.Attach(bc);
                    db.ObjectStateManager.ChangeObjectState(bc, EntityState.Added);
                }

            }

            db.Books.Attach(book);

            if (bookCopiesFromView.Count == 0) //if all the copies are delted from view, delete all from 
            {
                db.LibraryBookCopies.Where(c => c.BookId == book.BookId).ToList().ForEach(l => db.LibraryBookCopies.DeleteObject(l));
            }
            else
            {
                toBeDeletedLibraryBookCopies = book.LibraryBookCopies.Except(bookCopiesFromView).ToList();
                foreach (LibraryBookCopy bc in toBeDeletedLibraryBookCopies)
                {

                    db.ObjectStateManager.ChangeObjectState(bc, EntityState.Deleted);
                }
            }

            db.ObjectStateManager.ChangeObjectState(book, EntityState.Modified);
            db.SaveChanges();
            return RedirectToAction("Index");

        }
于 2012-08-30T03:04:35.013 に答える
0

新しいレコードを追加する前に、変更を保存してみてください。

//Remove all currently related records
book.LibraryBookCopies.Clear();
db.SaveChanges();

//Add copies from ViewModel to book object
foreach (LibraryBookCopy lBC in bookv.LibraryBookCopies)
{      book.LibraryBookCopies.Add(lBC); //Error here      }
于 2012-07-03T06:22:32.220 に答える