C# 使用begincollectionitem MVC发布错误#
我使用的是begincollectionitem组件,在尝试保存数据时,第C# 使用begincollectionitem MVC发布错误#,c#,asp.net-mvc,asp.net-mvc-4,razor,C#,Asp.net Mvc,Asp.net Mvc 4,Razor,我使用的是begincollectionitem组件,在尝试保存数据时,第db.SaveChanges()行出现错误。我使用MVC4E剃须刀 此消息错误: 操作失败:无法更改关系,因为 一个或多个外键属性不可为空。当 对关系进行更改时,相关的外键属性为 设置为空值。如果外键不支持空值, 必须定义新关系,外键属性必须为 指定了另一个非空值,或者必须为不相关的对象 删除 一个minha implementaçãoéesta: 模型 控制站 看法 @model FlexGestor.Models.Pr
db.SaveChanges()行出现错误代码>。我使用MVC4E剃须刀
此消息错误:
操作失败:无法更改关系,因为
一个或多个外键属性不可为空。当
对关系进行更改时,相关的外键属性为
设置为空值。如果外键不支持空值,
必须定义新关系,外键属性必须为
指定了另一个非空值,或者必须为不相关的对象
删除
一个minha implementaçãoéesta:
模型
控制站
看法
@model FlexGestor.Models.ProdutoPadrao
@使用(Html.BeginForm())
{
@Html.TituloPagina(“Visualizando Produto Padrão”,“派拉阿尤达集团”,“帮助Produto Padrao”)
@Html.HiddenFor(m=>m.ProdutoPadraoID)
@LabelFor(m=>m.descripcao)@Html.ValidationMessageFor(m=>m.descripcao)
@TextBoxFor(m=>m.descripao,新的{@class=“form control”})
@LabelFor(m=>m.Detalhe)@Html.ValidationMessageFor(m=>m.Detalhe)
@text区域(m=>m.Detalhe,新的{@class=“form control”,@rows=“4”})
@LabelFor(model=>model.listaProdutCaracteristica)
@如果(Model.ListaProdutoCaracteristica!=null)
{
foreach(Model.ListaProdutoCaracteristica中的var项)
{
Html.RenderPartial(“_CustomerPhonesEditor”,项目);
}
}
附加电话
@Html.BotaoTelaDetalhar()
}
查看详细信息
@model FlexGestor.Models.ProdutoPadraoCaracteristica
@使用(Html.BeginCollectionItem(“ListaProdutoCharacteristica”))
{
@Html.HiddenFor(m=>m.ProdutoPadraoID)
@Html.HiddenFor(m=>m.ProdutoPadraoCaracteristicaID)
@LabelFor(m=>m.TipoCaracteristicaID)@Html.ValidationMessageFor(m=>m.TipoCaracteristicaID)
@Html.DropDownList(“TipoCharacteristicaId”,(SelectList)ViewBag.listaCracteristica,String.Empty,
新的{@class=“表单控制”})
@LabelFor(m=>m.descripcao)@Html.ValidationMessageFor(m=>m.descripcao)
@TextBoxFor(m=>m.descripao,新的{@class=“form control”})
删除
}
下面的一行是导致问题的原因
model.ListaProdutoCaracteristica=null代码>
这将导致下面的属性为null,但它不是可为null的类型
public int-ProdutoPadraoID{get;set;}
如果希望能够以这种方式孤立记录,则需要将其更改为可为null的int:
公共int?ProdutoPadraoID{get;set;}
建议阅读:。尝试创建仍会产生此错误的最简单版本的代码。是否可以发布UpdateModel
方法?问题可能就在那里。它不是代理,它是一个断开连接的对象,您确定EF不会忽略列表吗?model.ListaProdutoCaracteristica=null代码>一个是我的测试,参加它也会出现问题。如果public int?ProdutoPadraoID{get;set;}
此错误消息:无法将值NULL插入表“testes.dbo.PRODUTOPADRAOCARACTERISTICA”的列“ProdutoPadraoID”;列不允许空值。更新失败。语句已终止。
我猜您必须找到一种方法来解耦列表中的项目。但是如何做到这一点呢?你能解释一下你想要达到的目标吗。您现在遇到的错误是因为您更改了模型,但映射到属性的db字段不允许空值。您可以通过不将属性设置为null来避免错误。你为什么这么做?你期望发生什么?@BenRobinson我正在屏幕上显示一个“ProdutoPadrao”对象及其子对象,使用类produtopadraocacteristica`begincollectionitem。问题在于,当试图保存具有
ProdutoPadraoCaracteristica`的某些记录的对象时,该对象给出了初始值。我应该怎么做才能不给出错误?我仍然不确定你想做什么,但是如果你想避免这个错误,你可以更新数据库以允许null或者不将属性设置为null。这两种方法都可以避免错误,但我不知道这两种方法是否都能得到你想要的结果。
public class ProdutoPadrao : IEntidadeBase
{
[Key]
public int ProdutoPadraoID { get; set; }
[Display(Name = "Descrição")]
public string Descricao { get; set; }
[Display(Name = "Detalhe")]
public string Detalhe { get; set; }
public virtual ICollection<ProdutoPadraoCaracteristica> ListaProdutoCaracteristica { get; set; }
}
public class ProdutoPadraoCaracteristica : IEntidadeBase
{
[Key]
public int ProdutoPadraoCaracteristicaID { get; set; }
public int ProdutoPadraoID { get; set; }
public string Descricao { get; set; }
public int TipoCaracteristicaID { get; set; }
[ForeignKey("ProdutoPadraoID")]
public virtual ProdutoPadrao ProdutoPadrao { get; set; }
}
[ControleDeAcesso(TipoAcao.Normal)]
[Authorize]
public ActionResult Detalhar(int id)
{
using (var db = new ERPContext())
{
var produtoPadrao = db.ProdutoPadrao.Include("ListaProdutoCaracteristica").Where(w => w.ProdutoPadraoID == id).ToList().FirstOrDefault();
var retorno = EntidadeBaseExt.ValidarRegistro(produtoPadrao, TipoAcao.Visualizar);
if (retorno != "")
{
TempData["MsgRetornoError"] = retorno;
return RedirectToAction("Index", "Home");
}
ViewBag.ListaCaracteristica = new SelectList(ListagemPadrao.ListaTipoCaracteristica(), "Key", "Texto");
ViewBag.ListaUnidadeMedida = new SelectList(db.UnidadeMedida.ToListERP().Select(l => new ItemLPesquisa { Key = l.UnidadeMedidaID, Texto = l.Descricao }).ToArray(), "Key", "Texto");
return View(produtoPadrao);
}
}
[Authorize]
[HttpPost]
[ControleDeAcesso(TipoAcao.Normal)]
public ActionResult Detalhar(string btnSubmit, ProdutoPadrao model)
{
if (!ModelState.IsValid)
{
return View(model);
}
using (var db = new ERPContext())
{
var produtoPadrao = db.ProdutoPadrao.Include("ListaProdutoCaracteristica").Where(w => w.ProdutoPadraoID == model.ProdutoPadraoID).ToList().FirstOrDefault();
var retorno = FlexGestor.Helpers.EntidadeBaseExt.ValidarRegistro(produtoPadrao, TipoAcao.Gravar);
if (retorno != "")
{
TempData["MsgRetornoError"] = retorno;
return RedirectToAction("Index", "Home");
}
if (btnSubmit != "Excluir")
UpdateModel(produtoPadrao);
FlexGestor.Helpers.EntidadeBaseExt.AtribuirValores(produtoPadrao, btnSubmit);
db.Entry(produtoPadrao).State = EntityState.Modified;
db.SaveChanges();
if (btnSubmit == "Excluir")
return RedirectToAction("Index", controller);
return RedirectToAction("Detalhar", controller, new { id = model.ProdutoPadraoID });
}
}
@model FlexGestor.Models.ProdutoPadrao
@using (Html.BeginForm())
{
<div class="row">
@Html.TituloPagina("Visualizando Produto Padrão", "Clique para abrir a ajuda", "#help_produtoPadrao")
@Html.HiddenFor(m => m.ProdutoPadraoID)
<div class="col-md-12">
@Html.LabelFor(m => m.Descricao) @Html.ValidationMessageFor(m => m.Descricao)
@Html.TextBoxFor(m => m.Descricao, new { @class = "form-control" })
</div>
<div class="col-md-12">
@Html.LabelFor(m => m.Detalhe) @Html.ValidationMessageFor(m => m.Detalhe)
@Html.TextAreaFor(m => m.Detalhe, new { @class = "form-control", @rows = "4" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.ListaProdutoCaracteristica)
<div class="controls">
<ul id="PhonesEditor" style="list-style-type: none">
@if (Model.ListaProdutoCaracteristica != null)
{
foreach (var item in Model.ListaProdutoCaracteristica)
{
Html.RenderPartial("_CustomerPhonesEditor", item);
}
}
</ul>
</div>
<p><a id="addAnother" class="small-button">AddPhone</a></p>
</div>
<div class="row">
<div class="col-md-12">
@Html.BotaoTelaDetalhar()
</div>
</div>
}
@model FlexGestor.Models.ProdutoPadraoCaracteristica
@using (Html.BeginCollectionItem("ListaProdutoCaracteristica"))
{
@Html.HiddenFor(m => m.ProdutoPadraoID)
@Html.HiddenFor(m => m.ProdutoPadraoCaracteristicaID)
<div class="col-md-3">
@Html.LabelFor(m => m.TipoCaracteristicaID) @Html.ValidationMessageFor(m => m.TipoCaracteristicaID)
@Html.DropDownList("TipoCaracteristicaID", (SelectList)ViewBag.ListaCaracteristica, String.Empty,
new { @class = "form-control" })
</div>
<div class="col-md-9">
@Html.LabelFor(m => m.Descricao) @Html.ValidationMessageFor(m => m.Descricao)
@Html.TextBoxFor(m => m.Descricao, new { @class = "form-control" })
</div>
<div class="form-group">
<div class="controls">
<a onclick="$(this).parent().parent().parent().remove();" class="small-button" style="float: left;">Delete</a>
</div>
</div>
}