none
Error al insertar una llave primaria duplicada. RRS feed

  • 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 controlador

    public ActionResult Create()
            {
                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);
            }

    Envio modelo
    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
    miércoles, 17 de diciembre de 2014 20:24

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
    jueves, 18 de diciembre de 2014 13: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
    jueves, 18 de diciembre de 2014 20:12

Todas las respuestas

  • Erick, en el siguiente Enlace veo que consultaste lo mismo y marcaste mas de una respuesta como valida, en todo caso que es lo que no has podido resolver o que problemas has tenido.
    miércoles, 17 de diciembre de 2014 20:50
  • >>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

    miércoles, 17 de diciembre de 2014 21:11
  • Antes el problema era la concatenación del campo para validar el llenado automatico.. ahora solo es el envio de un alert. si vez son diferentes.

    erikpugo

    jueves, 18 de diciembre de 2014 12:38
  • >>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
    jueves, 18 de diciembre de 2014 13: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
    jueves, 18 de diciembre de 2014 15:29
  • >>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

    jueves, 18 de diciembre de 2014 19:36
  • 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
    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.


    jueves, 18 de diciembre de 2014 20:41