Principales respuestas
Error al insertar una llave primaria duplicada.

Pregunta
-
Hola a todos.
Estoy trabajando con mvc 4 y sql server 2012.
El favor es el siguiente, necesito controlar una exception entity. ya que el me llama los datos pero cuando el cliente va a insertar un (id) repetido se revienta el código, por que este (id) ya esta en la base de datos guardado y no hay nada que le avise al usuario que ya esta creado, necesitaría un alert en la vista que le diga al usuario a la hora de guardar que ese id ya esta creado en la base de datos cuando le da click en el botón guardar.
Envio controladorpublic ActionResult Create()
Envio modelo
{
ViewBag.ST_Estado_CodigoEstado = new SelectList(ES, "ID", "NAME");
ViewBag.GN_PlanContable = new SelectList(EST, "ID", "NAME");
return View();
}
[HttpPost]
public ActionResult Create(GN_PlanContable gn_plancontable)
{
if (ModelState.IsValid)
{
db.GN_PlanContable.Add(gn_plancontable);
db.SaveChanges();
return RedirectToAction("confirm", "Home");
}
ViewBag.ST_Estado_CodigoEstado = new SelectList(db.ST_Estado, "CodigoEstado", "NombreEstado", gn_plancontable.ST_Estado_CodigoEstado);
ViewBag.GN_PlanContable = new SelectList(db.GN_PlanContable, "Padre", "NombrePlanContable", gn_plancontable.Padre);
return View(gn_plancontable);
}Código:public partial class GN_PlanContable { public GN_PlanContable() { this.CT_ItemDeContabilidad = new HashSet<CT_ItemDeContabilidad>(); this.CT_MovimientosContabilidad = new HashSet<CT_MovimientosContabilidad>(); this.CT_SaldoContabilidad = new HashSet<CT_SaldoContabilidad>(); } [Required(ErrorMessage = "*")] [Display(Name = "Codigo Cuenta")] [RegularExpression(@"[A-Za-z_0-9 .#_-]*\.?[A-Za-z_0-9 .#_-]+", ErrorMessage = "** ")] public string CodigoPlanContable { get; set; }
Código HTML:por ultimo envio el modelo vista y botón guardar@model SifActivoFijo.Models.GN_PlanContable @using (Ajax.BeginForm("Create", "PlanContable", new AjaxOptions { InsertionMode = InsertionMode.Replace, UpdateTargetId = "Resultado", OnSuccess = "$.fn.ParseFormValidation('createForm')" }, new { @id = "createForm", @name = "createForm" })) { <div class="separadores"> <div class="flota"> <div class="editor-label"> @Html.LabelFor(model => model.CodigoPlanContable) </div> <div class="editor-field"> @Html.EditorFor(model => model.CodigoPlanContable) @Html.ValidationMessageFor(model => model.CodigoPlanContable, "", new { @class = "validate" }) <div class="flota"> <input type="submit" value=" " class="guardar" /> </div> </div>
- Editado Erik Puentes miércoles, 17 de diciembre de 2014 20:35
Respuestas
-
>>Antes el problema era la concatenación del campo para validar el llenado automatico.. ahora solo es el envio de un alert
no entendi
quien genera el id, lo ingresa el cliente ? porque no se genera automatico de forma secuancial con un IDENTITY
saludos
Leandro Tuttini
Blog
MVP Profile
Buenos Aires
Argentina- Marcado como respuesta Erik Puentes jueves, 18 de diciembre de 2014 20:12
-
tengo la solución.. ya
public ActionResult Create(GN_PlanContable gn_plancontable)
{
if (ModelState.IsValid)
{
if ((!string.IsNullOrWhiteSpace(gn_plancontable.CodigoPlanContable)))
{
ModelState.AddModelError("", "Ya existe un Plan contable con este nombre");
}
if (ModelState.IsValid)
{
db.GN_PlanContable.Add(gn_plancontable);
db.SaveChanges();
return RedirectToAction("confirm", "Home");
}
}
ViewBag.ST_Estado_CodigoEstado = new SelectList(db.ST_Estado, "CodigoEstado", "NombreEstado", gn_plancontable.ST_Estado_CodigoEstado);
ViewBag.GN_PlanContable = new SelectList(db.GN_PlanContable, "Padre", "NombrePlanContable", gn_plancontable.Padre);
return View(gn_plancontable);
}erikpugo
- Marcado como respuesta Erik Puentes jueves, 18 de diciembre de 2014 20:12
Todas las respuestas
-
-
>>ya que el me llama los datos pero cuando el cliente va a insertar un (id) repetido se revienta el código, por que este (id) ya esta en la base de datos guardado y no hay nada que le avise al usuario que ya esta creado,
pero porque es el usuario quien define el id, si insertas una entidad nueva el id deberia ser secuencial, o sea IDENTITY
sino deberias validarlo tu previamente por codigo, podrias usar
bool existe = context.NombreEntidad.Any(x=> x.Id == id);
si ese id ya existe lo informas con un mensaje al usuario
saludos
Leandro Tuttini
Blog
MVP Profile
Buenos Aires
Argentina -
-
>>Antes el problema era la concatenación del campo para validar el llenado automatico.. ahora solo es el envio de un alert
no entendi
quien genera el id, lo ingresa el cliente ? porque no se genera automatico de forma secuancial con un IDENTITY
saludos
Leandro Tuttini
Blog
MVP Profile
Buenos Aires
Argentina- Marcado como respuesta Erik Puentes jueves, 18 de diciembre de 2014 20:12
-
El id es la llave primaria de la tabla CodigoPlanContable , varchar(255), el cliente ingresa un código cualquiera que se inserta en la tabla GN_PlanContable, tal cual como se muestra arriba, Bueno en mi caso hay mas campos pero en especifico este campo no quiero que se duplique. , el siempre me acepta el model, por que los daots que recibe están correctos, al momento de guardar es donde me sale el error.. lo único que quiero es que me envie un alert diciéndole al cliente este código ya esta creado.
[HttpPost]
public ActionResult Create(GN_PlanContable gn_plancontable)
{
if (ModelState.IsValid)
{
db.GN_PlanContable.Add(gn_plancontable);
db.SaveChanges();
return RedirectToAction("confirm", "Home");
}lo estoy tratando de hacer como me dijiste, pero igualmente me sigue apareciendo el error. mira como lo hago.
[HttpPost]
public ActionResult Create(GN_PlanContable gn_plancontable)
{
if (ModelState.IsValid)
{
if (!db.GN_PlanContable.Any(model =>model.CodigoPlanContable == gn_plancontable.CodigoPlanContable))
{
return ViewBag("Error");
}
else{
db.GN_PlanContable.Add(gn_plancontable);
db.SaveChanges();
return RedirectToAction("confirm", "Home");
}
}aquí el HTML d ela vista crear
<div class="separadores">
<div class="flota">
<div class="editor-label">
@Html.LabelFor(model => model.CodigoPlanContable)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.CodigoPlanContable)
@Html.ValidationMessageFor(model => model.CodigoPlanContable, "", new { @class = "validate" })
@ViewBag.Error
</div>
erikpugo
el error
en System.Data.Entity.Internal.InternalContext.SaveChanges()
en System.Data.Entity.Internal.LazyInternalContext.SaveChanges()
en System.Data.Entity.DbContext.SaveChanges()
en SifActivoFijo.Controllers.PlanContableController.Create(GN_PlanContable gn_plancontable) en c:\Users\epuentes\Desktop\Copia sif\Desarrollo\SifActivoFijo\SifActivoFijo\Controllers\PlanContableController.cs:línea 156
en lambda_method(Closure , ControllerBase , Object[] )
en System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters)
en System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters)
en System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters)
en System.Web.Mvc.Async.AsyncControllerActionInvoker.ActionInvocation.InvokeSynchronousActionMethod()
en System.Web.Mvc.Async.AsyncControllerActionInvoker.<BeginInvokeSynchronousActionMethod>b__36(IAsyncResult asyncResult, ActionInvocation innerInvokeState)
en System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`2.CallEndDelegate(IAsyncResult asyncResult)
en System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResultBase`1.End()
en System.Web.Mvc.Async.AsyncResultWrapper.End[TResult](IAsyncResult asyncResult, Object tag)
en System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult)
en System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3c()
en System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.<>c__DisplayClass45.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3e()- Editado Erik Puentes jueves, 18 de diciembre de 2014 15:37
-
>>lo único que quiero es que me envie un alert diciéndole al cliente este código ya esta creado.
podrias utilizar un remote validation que verifique si el id ingresado ya existe
How to: Implement Remote Validation in ASP.NET MVC
de esta forma podrias mostrar al usuario un mensaje indicando que no puede ingresar ese id
saludos
Leandro Tuttini
Blog
MVP Profile
Buenos Aires
Argentina -
tengo la solución.. ya
public ActionResult Create(GN_PlanContable gn_plancontable)
{
if (ModelState.IsValid)
{
if ((!string.IsNullOrWhiteSpace(gn_plancontable.CodigoPlanContable)))
{
ModelState.AddModelError("", "Ya existe un Plan contable con este nombre");
}
if (ModelState.IsValid)
{
db.GN_PlanContable.Add(gn_plancontable);
db.SaveChanges();
return RedirectToAction("confirm", "Home");
}
}
ViewBag.ST_Estado_CodigoEstado = new SelectList(db.ST_Estado, "CodigoEstado", "NombreEstado", gn_plancontable.ST_Estado_CodigoEstado);
ViewBag.GN_PlanContable = new SelectList(db.GN_PlanContable, "Padre", "NombrePlanContable", gn_plancontable.Padre);
return View(gn_plancontable);
}erikpugo
- Marcado como respuesta Erik Puentes jueves, 18 de diciembre de 2014 20:12
-
Erick, 2 sugerencias:
Primero, no es necesario hacer dos veces la consulta if (ModelState.IsValid)
if ((!string.IsNullOrWhiteSpace(gn_plancontable.CodigoPlanContable))) { ModelState.AddModelError("", "Ya existe un Plan contable con este nombre"); } if (ModelState.IsValid) { db.GN_PlanContable.Add(gn_plancontable); db.SaveChanges(); return RedirectToAction("confirm", "Home"); }
Segundo, imagino que tienes claro que para que te mande el error a la vista debe de haber antes un postback verdad?. Este método no te permite hacer las validaciones en línea o en caliente (no se como expresarlo). Es mejor hacer una validación remota apoyándote con DataAnnotations, tal como te lo sugerí en su momento y como también te lo dijo Leandro.