我正在尝试使Create方法成为Estoque实体,但是在尝试注册时出现错误。
错误:
处理请求时发生未处理的异常。 MySqlException:无法添加或更新子行:外键 约束失败(
rkmes
。estoque
,约束FK_Estoque_Linha_LinhaId
外键(LinhaId
)参考linha
(Id
)删除级联) MySqlConnector.Core.ServerSession.TryAsyncContinuation(任务> 任务)在ServerSession.cs中,行1169MySqlException:无法添加或更新子行:外键 约束失败(
rkmes
。estoque
,约束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提供程序。
有人可以告诉我我要去哪里了吗
此站点上已经讨论了有关此错误的主题,但没有一个可以帮助我解决该问题。
答案 0 :(得分:1)
对于您当前的设计,我假设Estoque obj
的值将为null。这是由于当您使用当前视图提交表单时,它将提交数据
estoque.Name: sfe
estoque.TipoEstoqueId: 3
estoque.LinhaId: 2
这将无法将数据绑定到Estoque obj
。
要解决此问题,请按照以下方法操作:
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; }
}
控制器
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");
}
}
查看
@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>