.Net Core-MySqlException:无法添加或更新子行

时间:2019-07-12 16:33:18

标签: mysql asp.net-mvc asp.net-core-mvc

我正在尝试使Create方法成为Estoque实体,但是在尝试注册时出现错误。

错误:

  

处理请求时发生未处理的异常。   MySqlException:无法添加或更新子行:外键   约束失败(rkmesestoque,约束   FK_Estoque_Linha_LinhaId外键(LinhaId)参考linha   (Id)删除级联)   MySqlConnector.Core.ServerSession.TryAsyncContinuation(任务>   任务)在ServerSession.cs中,行1169

     

MySqlException:无法添加或更新子行:外键   约束失败(rkmesestoque,约束   FK_Estoque_Linha_LinhaId外键(LinhaId)参考linha   (Id)删除级联)   MySql.Data.MySqlClient.MySqlDataReader.ActivateResultSet(ResultSet   第93行的MySqlDataReader.cs中的resultSet)

     

DbUpdateException:更新条目时发生错误。看到   内部异常的详细信息。   Microsoft.EntityFrameworkCore.Update.ReaderModificationCommandBatch.ExecuteAsync(IRelationalConnection   连接,CancelationToken cancelToken)

这些是我的方法:

EstoqueService

public async Task InsertAsync(Estoque obj)
        {
            _context.Estoque.Add(obj);
            await _context.SaveChangesAsync();
        }

EstoqueController

//GET CREATE
    public async Task<IActionResult> Create()
        {
            var linha = await _linhaContext.FindAllAsync();
            var tipoEstoque = await _tipoEstoqueContext.FindAllAsync();
            var viewModel = new EstoqueViewModel
            {
                Linhas = linha,
                TipoEstoques = tipoEstoque
            };
            return View(viewModel);
        }
        //POST CREATE
        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Create(Estoque obj)
        {
            /*verifica se post é valido. Se  o js estiver desabilitado no navegador do usuario
            ele consegue dar post vazio, esse if serve para previnir isso*/
            if (!ModelState.IsValid)
            {
                var linha = await _linhaContext.FindAllAsync();
                var tipoEstoque = await _tipoEstoqueContext.FindAllAsync();
                var viewModel = new EstoqueViewModel
                {
                    Linhas = linha,
                    TipoEstoques = tipoEstoque
                };
                return View(viewModel);
            }
            await _estoqueContext.InsertAsync(obj);
            return RedirectToAction(nameof(Index));
        }

EstoqueViewModel

public class EstoqueViewModel
    {
        public Estoque estoque { get; set; }
        public ICollection<Linha> Linhas { get; set; }
        public ICollection<TipoEstoque> TipoEstoques { get; set; }
    }

查看创建

<div class="row">
    <div class="col-md-4">
        <form asp-action="Create">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
            <div class="form-group">
                <label asp-for="estoque.Nome" class="control-label"></label>
                <input asp-for="estoque.Nome" class="form-control" />
                <span asp-validation-for="estoque.Nome" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="estoque.Descricao" class="control-label"></label>
                <input asp-for="estoque.Descricao" class="form-control" />
                <span asp-validation-for="estoque.Descricao" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="estoque.TipoEstoqueId" class="control-label"></label>
                <select asp-for="estoque.TipoEstoqueId" class ="form-control" asp-items="@(new SelectList(Model.TipoEstoques,"Id","Nome"))"></select>
            </div>
            <div class="form-group">
                <label asp-for="estoque.LinhaId" class="control-label"></label>
                <select asp-for="estoque.LinhaId" class ="form-control" asp-items="@(new SelectList(Model.Linhas,"Id","Nome","Descricao"))"></select>
            </div>
            <div class="form-group">
                <input type="submit" value="Create" class="btn btn-default" />
            </div>
        </form>
    </div>
</div>

在Estoque记录中,您必须同时选择Linha和TupoEstoque实体。

我正在使用MYSQL提供程序。

有人可以告诉我我要去哪里了吗

此站点上已经讨论了有关此错误的主题,但没有一个可以帮助我解决该问题。

1 个答案:

答案 0 :(得分:1)

对于您当前的设计,我假设Estoque obj的值将为null。这是由于当您使用当前视图提交表单时,它将提交数据

estoque.Name: sfe
estoque.TipoEstoqueId: 3
estoque.LinhaId: 2

这将无法将数据绑定到Estoque obj

要解决此问题,请按照以下方法操作:

  1. Model

    public class Estoque
    {
        public int Id { get; set; }
        [Required]
        public string Name { get; set; }
        public int LinhaId { get; set; }
        public virtual Linha Linha { get; set; }
        public int TipoEstoqueId { get; set; }
        public virtual TipoEstoque TipoEstoque { get; set; }
    
    }
    public class Linha
    {
        public int Id { get; set; }
        public string LName { get; set; }
    }
    public class TipoEstoque
    {
        public int Id { get; set; }
        public string TName { get; set; }
    }
    public class EstoqueViewModel
    {
        public Estoque estoque { get; set; }
        public ICollection<Linha> Linhas { get; set; }
        public ICollection<TipoEstoque> TipoEstoques { get; set; }
    }
    
  2. 控制器

    public class EstoqueController : Controller
    {
        private readonly ApplicationDbContext _context;
        public EstoqueController(ApplicationDbContext context)
        {
            _context = context;
        }
        public async Task<IActionResult> Create()
        {
            var linha = await _context.Linha.ToListAsync();
            var tipoEstoque = await _context.TipoEstoque.ToListAsync();
            var viewModel = new EstoqueViewModel
            {
                estoque = new Estoque(),
                Linhas = linha,
                TipoEstoques = tipoEstoque
            };
            return View(viewModel);
        }
        //POST CREATE
        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Create(EstoqueViewModel obj)
        {
            /*verifica se post é valido. Se  o js estiver desabilitado no navegador do usuario
            ele consegue dar post vazio, esse if serve para previnir isso*/
            if (!ModelState.IsValid)
            {
                var linha = await _context.Linha.ToListAsync();
                var tipoEstoque = await _context.TipoEstoque.ToListAsync();
                var viewModel = new EstoqueViewModel
                {
                    estoque = new Estoque(),
                    Linhas = linha,
                    TipoEstoques = tipoEstoque
                };
                return View(viewModel);
            }
            var model = obj.estoque;
    
            await _context.Estoque.AddAsync(model);
            await _context.SaveChangesAsync();
            return Ok("OK");
        }
    }
    
  3. 查看

    @model EstoqueViewModel
    @{
        ViewData["Title"] = "Create";
        //var estoque = new Estoque();
    }
    
    <h1>Create</h1>
    
    <div class="row">
        <div class="col-md-4">
            <form asp-action="Create">
                <div asp-validation-summary="ModelOnly" class="text-danger"></div>
                <div class="form-group">
                    <label asp-for="@Model.estoque.Name" class="control-label"></label>
                    <input asp-for="@Model.estoque.Name" class="form-control" />
                    <span asp-validation-for="@Model.estoque.Name" class="text-danger"></span>
                </div>
                <div class="form-group">
                    <label asp-for="@Model.estoque.TipoEstoqueId" class="control-label"></label>
                    <select asp-for="@Model.estoque.TipoEstoqueId" class="form-control" asp-items="@(new SelectList(Model.TipoEstoques,"Id","TName"))"></select>
                </div>
                <div class="form-group">
                    <label asp-for="@Model.estoque.LinhaId" class="control-label"></label>
                    <select asp-for="@Model.estoque.LinhaId" class="form-control" asp-items="@(new SelectList(Model.Linhas,"Id","LName"))"></select>
                </div>
                <div class="form-group">
                    <input type="submit" value="Create" class="btn btn-default" />
                </div>
            </form>
        </div>
    </div>