Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EF核心:更新一对多关系相关实体id_C#_Asp.net Mvc_Asp.net Core_Asp.net Core Mvc_Entity Framework Core - Fatal编程技术网

C# EF核心:更新一对多关系相关实体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

我是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)
.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);

    }