Asp.net mvc 添加多对多关系而不从数据库中获取子实体

Asp.net mvc 添加多对多关系而不从数据库中获取子实体,asp.net-mvc,asp.net-mvc-3,entity-framework,entity-framework-4,many-to-many,Asp.net Mvc,Asp.net Mvc 3,Entity Framework,Entity Framework 4,Many To Many,我有具有多对多关系的Book和Author实体,我正在尝试使用数据库优先的方法保存关系(连接表中的记录) 我想从我的工作版本代码开始 [HttpPost] public ActionResult Edit(BookViewModel bookv) { Mapper.CreateMap<AuthorViewModel, Author>(); List<Author> authors = Map

我有具有多对多关系的Book和Author实体,我正在尝试使用数据库优先的方法保存关系(连接表中的记录)

我想从我的工作版本代码开始

 [HttpPost]
        public ActionResult Edit(BookViewModel bookv)
        {
            Mapper.CreateMap<AuthorViewModel, Author>();
            List<Author> authors = Mapper.Map<List<AuthorViewModel>, List<Author>>
(bookv.Authors.ToList());
//remove authors from book object to avoid multiple entities with same key error
           bookv.Authors.Clear();
            Mapper.CreateMap< BookViewModel,Book>();
            Book  book = Mapper.Map<BookViewModel,Book>(bookv);

            db.Books.Attach(book);          
            book.Authors.Clear();
            foreach (Author a in authors)
            {
                //Fetch Author and add relation to book object
                book.Authors.Add(db.Authors.Single(at=>at.AuthorId==a.AuthorId));
            }

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

        }
[HttpPost]
公共行动结果编辑(BookViewModel bookv)
{
CreateMap();
List authors=Mapper.Map
(bookv.Authors.ToList());
//从book对象中删除作者,以避免多个实体出现相同的键错误
bookv.Authors.Clear();
CreateMap();
Book Book=Mapper.Map(bookv);
db.图书。附(图书);
book.Authors.Clear();
foreach(作者中的作者a)
{
//获取作者并将关系添加到图书对象
Add(db.Authors.Single(at=>at.authord==a.authord));
}
db.ObjectStateManager.ChangeObjectState(book,EntityState.Modified);
db.SaveChanges();
返回操作(“索引”);
}
在上面的代码中,我从数据库中获取Author对象(记录),以添加与book对象的关系。然而,我不是从数据库中获取Book对象,而是将其附加到上下文中。我不能对作者对象执行类似操作吗?

我曾尝试使用此代码执行此操作,但它首先将新记录添加到Author表,并添加与book和新创建(不需要的)作者的关系:

[HttpPost]
公共行动结果编辑(BookViewModel bookv)
{
CreateMap();
List authors=Mapper.Map(bookv.authors.ToList());
//bookv.Authors.Clear();
CreateMap();
Book Book=Mapper.Map(bookv);
foreach(书中的作者。作者)
{
db.作者附(a);
}
db.图书。附(图书);
foreach(作者中的作者a)
{
书。作者。添加(a);
}
db.ObjectStateManager.ChangeObjectState(book,EntityState.Modified);
db.SaveChanges();
返回操作(“索引”);
}

db.Authors.Attach(a)
循环之前,您是否尝试调用
db.Books.Attach(book)

另外,你有没有试着把这本书添加到作者中?像
a.Books.Add(book)而不是

[HttpPost]
公共行动结果编辑(BookViewModel bookv)
{
//创建地图
CreateMap();
CreateMap();
//将视图对象转换为模型对象
Book Book=Mapper.Map(bookv);
List authors=Mapper.Map(bookv.authors.ToList());
book.Authors.Clear();
db.图书。附(图书);
foreach(authors中的Author a){db.authors.Attach(a);}
book.Authors.Clear();
foreach(authors中的作者a){book.authors.Add(a);}
db.ObjectStateManager.ChangeObjectState(book,EntityState.Modified);
db.SaveChanges();
返回操作(“索引”);
}

谢谢@thedeeno。但它什么也没做。没有错误和重复。我把代码改成这个,它工作正常。在作者之前附上一本书是关键<代码>数据库书籍。附加(书籍);foreach(authors中的Author a){db.authors.Attach(a);}book.authors.Clear();foreach(authors中的作者a){book.authors.Add(a);}
 [HttpPost]
    public ActionResult Edit(BookViewModel bookv)
    {
        Mapper.CreateMap<AuthorViewModel, Author>();
        List<Author> authors = Mapper.Map<List<AuthorViewModel>, List<Author>>(bookv.Authors.ToList());
    //   bookv.Authors.Clear();
        Mapper.CreateMap< BookViewModel,Book>();
        Book  book = Mapper.Map<BookViewModel,Book>(bookv);

        foreach (Author a in book.Authors)
        {
            db.Authors.Attach(a);
        }

        db.Books.Attach(book);

        foreach (Author a in authors)
        {
            book.Authors.Add(a);
        }
     db.ObjectStateManager.ChangeObjectState(book, EntityState.Modified);
            db.SaveChanges();
            return RedirectToAction("Index");

        }
db.Books.Attach(book);
foreach (Author a in book.Authors)
{
    db.Authors.Attach(a);
    a.Books.Add(book);
}
[HttpPost]
        public ActionResult Edit(BookViewModel bookv)
        {
            //create maps
            Mapper.CreateMap<AuthorViewModel, Author>();
            Mapper.CreateMap<BookViewModel, Book>();

            //convert view objects to model objects
            Book book = Mapper.Map<BookViewModel, Book>(bookv);
            List<Author> authors = Mapper.Map<List<AuthorViewModel>, List<Author>>   (bookv.Authors.ToList());

            book.Authors.Clear();
            db.Books.Attach(book);


            foreach (Author a in authors) { db.Authors.Attach(a); }

            book.Authors.Clear();

            foreach (Author a in authors) { book.Authors.Add(a); }

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

        }