C# EF核心:更新一对多关系相关实体id
我是ASP.NET核心和EF核心的新手。请检查我的代码,让我知道我做错了什么 **AuthorId的外键约束冲突。 **无法跟踪BookCategory实体,因为正在跟踪另一个具有相同ID的实例 图书模型C# EF核心:更新一对多关系相关实体id,c#,asp.net-mvc,asp.net-core,asp.net-core-mvc,entity-framework-core,C#,Asp.net Mvc,Asp.net Core,Asp.net Core Mvc,Entity Framework Core,我是ASP.NET核心和EF核心的新手。请检查我的代码,让我知道我做错了什么 **AuthorId的外键约束冲突。 **无法跟踪BookCategory实体,因为正在跟踪另一个具有相同ID的实例 图书模型 [HttpGet] 公共IActionResult编辑(int?id) { if(id==null) { 返回NotFound(); } var book=_db.Books.Include(b=>b.Category) .Include(b=>b.Author) .SingleOrDefa
[HttpGet]
公共IActionResult编辑(int?id)
{
if(id==null)
{
返回NotFound();
}
var book=_db.Books.Include(b=>b.Category)
.Include(b=>b.Author)
.SingleOrDefault(b=>b.BookId==id);
if(book==null)
{
返回NotFound();
}
ViewModel.Book=Book;
返回视图(ViewModel);
}
[HttpPost]
[ValidateAntiForgeryToken]
公共异步任务编辑(BookViewModel模型,int?id)
{
if(id==null)
{
返回NotFound();
}
if(id!=model.Book.BookId)
{
返回NotFound();
}
如果(!ModelState.IsValid)
{
/*ViewModel.Book=model.Book;
返回视图(ViewModel)*/
var errors=ModelState.Select(x=>x.Value.errors)
.其中(y=>y.计数>0)
.ToList();
返回Json(新的{errors});
}
var dbModel=_db.Books.Include(b=>b.Category).Where(b=>b.BookId==id).FirstOrDefault();
var file=HttpContext.Request.Form.Files;
如果(file.Count>0)
{
var RootDirectory=\u hostingEnvironment.WebRootPath;
var extension=Path.GetExtension(文件[0].FileName);
var filePath=Path.Combine(DataContext.ImageDirectory,model.Book.BookId+扩展名);
使用(var fileStream=newfilestream(Path.Combine(RootDirectory,filePath),FileMode.Create))
{
文件[0]。复制到(fileStream);
}
dbModel.ImagePath=@“/”文件路径;
}
dbModel.authord=model.Book.authord;
dbModel.CategoryId=model.Book.CategoryId;
dbModel.Discount=model.Book.Discount;
dbModel.Price=model.Book.Price;
dbModel.Stock=model.Book.Stock;
dbModel.Title=model.Book.Title;
等待_db.SaveChangesAsync();
返回重定向到操作(名称(索引));
}
您需要在模型的id属性中添加key属性
接下来需要更新的事情是告诉_db先更新实体,然后再保存更改
为什么要使用async和Wait?这些控制器操作是否会降低UI的速度
你还可以发布你的图书视图模型吗
你的行动方法在某些地方是错误的。如果你需要更详细的建议,请告诉我
[HttpGet]
public IActionResult Edit(int? id)
{
//Give this a name other than view model for example BookViewModel
ViewModel model = new ViewModel();
if (id == null)
{
return NotFound();
}
var book = _db.Books.Include(b => b.Category)
.Include(b => b.Author)
.SingleOrDefault(b => b.BookId == id);
if (book == null)
{
return NotFound();
}
model.Book = book;
return View(model);
}
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(BookViewModel model, int? id)
{
if (id == null || id != model.Book.BookId)
{
return NotFound();
}
if (ModelState.IsValid)
{
var dbModel = _db.Books.Include(b => b.Category).Where(b => b.BookId == id).FirstOrDefault();
var files = HttpContext.Request.Form.Files;
if (files.Any())
{
var RootDirectory = _hostingEnvironment.WebRootPath;
var extension = Path.GetExtension(files[0].FileName);
var filePath = Path.Combine(DataContext.ImageDirectory, model.Book.BookId + extension);
using (var fileStream = new FileStream(Path.Combine(RootDirectory, filePath), FileMode.Create))
{
file[0].CopyTo(fileStream);
}
dbModel.ImagePath = @"/" + filePath;
}
dbModel.AuthorId = model.Book.AuthorId;
dbModel.CategoryId = model.Book.CategoryId;
dbModel.Discount = model.Book.Discount;
dbModel.Price = model.Book.Price;
dbModel.Stock = model.Book.Stock;
dbModel.Title = model.Book.Title;
await _db.Books.UpdateAsync(dbModel);
await _db.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
return View(model);
}
[HttpGet]
公共IActionResult编辑(int?id)
{
//为其指定一个视图模型以外的名称,例如BookViewModel
ViewModel模型=新的ViewModel();
if(id==null)
{
返回NotFound();
}
var book=_db.Books.Include(b=>b.Category)
.Include(b=>b.Author)
.SingleOrDefault(b=>b.BookId==id);
if(book==null)
{
返回NotFound();
}
model.Book=Book;
返回视图(模型);
}
[HttpPost]
[ValidateAntiForgeryToken]
公共异步任务编辑(BookViewModel模型,int?id)
{
if(id==null | | id!=model.Book.BookId)
{
返回NotFound();
}
if(ModelState.IsValid)
{
var dbModel=_db.Books.Include(b=>b.Category).Where(b=>b.BookId==id).FirstOrDefault();
var files=HttpContext.Request.Form.files;
if(files.Any())
{
var RootDirectory=\u hostingEnvironment.WebRootPath;
var extension=Path.GetExtension(文件[0].FileName);
var filePath=Path.Combine(DataContext.ImageDirectory,model.Book.BookId+扩展名);
使用(var fileStream=newfilestream(Path.Combine(RootDirectory,filePath),FileMode.Create))
{
文件[0]。复制到(fileStream);
}
dbModel.ImagePath=@“/”文件路径;
}
dbModel.authord=model.Book.authord;
dbModel.CategoryId=model.Book.CategoryId;
dbModel.Discount=model.Book.Discount;
dbModel.Price=model.Book.Price;
dbModel.Stock=model.Book.Stock;
dbModel.Title=model.Book.Title;
wait_db.Books.UpdateAsync(dbModel);
等待_db.SaveChangesAsync();
返回重定向到操作(名称(索引));
}
返回视图(模型);
}
是的,当然请提供一些更详细的答案。但是要小心异步等待。你为什么使用Async/Await?你知道,我是个新手。无论如何,我读到在数据库操作过程中使用它们是一个很好的实践。这实际上取决于上下文。通常,只有当用户界面被阻止时,才会出现这种情况。您将工作粘贴到另一个线程上,让ui线程继续。如果你是一个新手,坚持基础知识。只有在真正需要的时候才使用。@Mdkhalidhasan建议使用async/await。添加await\u db.Books.UpdateAsync(dbModel)后是否存在问题代码>?
public class BookCategory
{
public int Id { get; set; }
[Display(Name = "Category Name")]
public string CategoryName { get; set; }
public ICollection<Book> Books { get; set; }
}
public class Author
{
public int AuthorId { get; set; }
public string Name { get; set; }
public ICollection<Book> Books { get; set; }
}
private readonly ApplicationDbContext _db;
private readonly HostingEnvironment _hostingEnvironment;
[BindProperty]
public BookViewModel ViewModel { get; set; }
public BookController(ApplicationDbContext db, HostingEnvironment host)
{
_db = db;
_hostingEnvironment = host;
ViewModel = new BookViewModel()
{
Book = new Models.Book(),
Authors = _db.Authors.ToList(),
BookCategories = _db.BookCategories.ToList(),
Tags = _db.Tags.ToList()
};
}
[HttpGet]
public IActionResult Edit(int? id)
{
if (id == null)
{
return NotFound();
}
var book = _db.Books.Include(b => b.Category)
.Include(b => b.Author)
.SingleOrDefault(b => b.BookId == id);
if (book == null)
{
return NotFound();
}
ViewModel.Book = book;
return View(ViewModel);
}
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(BookViewModel model, int? id)
{
if (id == null)
{
return NotFound();
}
if (id != model.Book.BookId)
{
return NotFound();
}
if (!ModelState.IsValid)
{
/*ViewModel.Book = model.Book;
return View(ViewModel);*/
var errors = ModelState.Select(x => x.Value.Errors)
.Where(y => y.Count > 0)
.ToList();
return Json(new { errors });
}
var dbModel = _db.Books.Include(b => b.Category).Where(b => b.BookId == id).FirstOrDefault();
var file = HttpContext.Request.Form.Files;
if (file.Count > 0)
{
var RootDirectory = _hostingEnvironment.WebRootPath;
var extension = Path.GetExtension(file[0].FileName);
var filePath = Path.Combine(DataContext.ImageDirectory, model.Book.BookId + extension);
using (var fileStream = new FileStream(Path.Combine(RootDirectory, filePath), FileMode.Create))
{
file[0].CopyTo(fileStream);
}
dbModel.ImagePath = @"/" + filePath;
}
dbModel.AuthorId = model.Book.AuthorId;
dbModel.CategoryId = model.Book.CategoryId;
dbModel.Discount = model.Book.Discount;
dbModel.Price = model.Book.Price;
dbModel.Stock = model.Book.Stock;
dbModel.Title = model.Book.Title;
await _db.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
[HttpGet]
public IActionResult Edit(int? id)
{
//Give this a name other than view model for example BookViewModel
ViewModel model = new ViewModel();
if (id == null)
{
return NotFound();
}
var book = _db.Books.Include(b => b.Category)
.Include(b => b.Author)
.SingleOrDefault(b => b.BookId == id);
if (book == null)
{
return NotFound();
}
model.Book = book;
return View(model);
}
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(BookViewModel model, int? id)
{
if (id == null || id != model.Book.BookId)
{
return NotFound();
}
if (ModelState.IsValid)
{
var dbModel = _db.Books.Include(b => b.Category).Where(b => b.BookId == id).FirstOrDefault();
var files = HttpContext.Request.Form.Files;
if (files.Any())
{
var RootDirectory = _hostingEnvironment.WebRootPath;
var extension = Path.GetExtension(files[0].FileName);
var filePath = Path.Combine(DataContext.ImageDirectory, model.Book.BookId + extension);
using (var fileStream = new FileStream(Path.Combine(RootDirectory, filePath), FileMode.Create))
{
file[0].CopyTo(fileStream);
}
dbModel.ImagePath = @"/" + filePath;
}
dbModel.AuthorId = model.Book.AuthorId;
dbModel.CategoryId = model.Book.CategoryId;
dbModel.Discount = model.Book.Discount;
dbModel.Price = model.Book.Price;
dbModel.Stock = model.Book.Stock;
dbModel.Title = model.Book.Title;
await _db.Books.UpdateAsync(dbModel);
await _db.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
return View(model);
}