如果记录被其他用户在编辑方法控制器中删除,则得到Null

时间:2018-11-08 15:43:58

标签: c# asp.net-mvc entity-framework

如果记录已被其他用户在编辑方法控制器中删除,我会得到Null,这是我的控制器代码:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Edit([Bind(Include = "CN_PeriodoId,CN_EmpresaId,CN_PeriodoDscr,CN_PeriodoComments,CN_PerEsId,LastUpdated,UserUpdated")] CN_EmpresaPeriodo cN_EmpresaPeriodo)
    {
        if (ModelState.IsValid)
        {
            try
            {

                //cN_EmpresaPeriodo.CN_EmpresaId = Empresa;
                //cN_EmpresaPeriodo.UserUpdated = GetUserName();
                //cN_EmpresaPeriodo.LastUpdated = GetDateFromServer();
                db.Entry(cN_EmpresaPeriodo).State = EntityState.Modified;
                db.SaveChanges();
            return RedirectToAction("Index");
            }
            catch (DbUpdateConcurrencyException ex)
            {
                ModelState.AddModelError(string.Empty, "Se encontró que otro usuario modificó la información. "+  "verificar:" + ex.Message);
                var entry = ex.Entries.Single();             
                /// Here im getting Null like if the record was deleted by other user       
                var databaseEntry = entry.GetDatabaseValues();
                var clientValues = (CN_EmpresaPeriodo)entry.Entity;
                if (databaseEntry == null)
                {
                    ModelState.AddModelError(string.Empty,
                        "Unable to save changes. This Item was deleted by another user.");
                }
                else
                {
                    var databaseValues = (CN_EmpresaPeriodo)databaseEntry.ToObject();

                    if (databaseValues.CN_EmpresaId != clientValues.CN_EmpresaId)
                        ModelState.AddModelError("CN_EmpresaId", "Current value: "
                            + databaseValues.CN_EmpresaId);
                    if (databaseValues.CN_PeriodoDscr != clientValues.CN_PeriodoDscr)
                        ModelState.AddModelError("CN_PeriodoDscr", "Current value: "
                            + databaseValues.CN_PeriodoDscr);
                    if (databaseValues.CN_PerEsId!= clientValues.CN_PerEsId)
                        ModelState.AddModelError("StartDate", "Current value: "
                            +   databaseValues.CN_PerEsId);                   
                }

            }
            catch (Exception ex)
            {
                ModelState.AddModelError(string.Empty,"verificar:"+ ex.Message);
            }
        }
        ViewBag.CN_PerEsId = new SelectList(db.CN_EmpresaPeriodoEstado, "CN_PerEsId", "CN_PerEsDscr", cN_EmpresaPeriodo.CN_PerEsId);
        return View(cN_EmpresaPeriodo);
    }

这是我的模型结构

public class CN_EmpresaPeriodo
{ 
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    [DisplayName("Periodo Id")]
    public long CN_PeriodoId { get; set; }

    [Index(IsUnique = false)]
    [DisplayName("Empresa")]
    [Required(ErrorMessage = "Empresa debe ser valido")]
    [ScaffoldColumn(false)]
    public long CN_EmpresaId { get; set; } // igual como esta en el modelo 

    [Required(ErrorMessage = "Periodo debe ser valido")]
    [DisplayName("Periodo")]
    [StringLength(100)]
    [MinLength(5)]
    public string CN_PeriodoDscr { get; set; }

    [DisplayName("Periodo Comentarios")]
    [StringLength(300)]
    public string CN_PeriodoComments { get; set; }

    [Index(IsUnique = false)]
    [DisplayName("Periodo Estatus")]
    [DefaultValue(1)]       
    public int CN_PerEsId { get; set; } // igual como esta en el modelo 

    [ScaffoldColumn(false)]
    [DataType(DataType.Date)]
    [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
    [DisplayName("Ultima actualizacion")]
    public  Nullable<DateTime> LastUpdated { get; set; }

    //  [HiddenInput(DisplayValue = false)]
    [ScaffoldColumn(false)]
    [DisplayName("Actualizado por")]
    [StringLength(30)]
    public string UserUpdated { get; set; }

    //[Timestamp]
    //public byte[] RowVersion { get; set; }

    public CN_EmpresaPeriodoEstado CN_EmpresaPeriodoEstado { get; set; } // armo la relacion 1 to *        
}

此类是我有问题的模型的参考调用:

 public class CN_EmpresaPeriodoEstado
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.None)]
        [ScaffoldColumn(false)]
        [DisplayName("Periodo Id")]
        public int CN_PerEsId { get; set; }

        [DisplayName("Estado")]
        [StringLength(100)]
        [Required(ErrorMessage = "Descripcion debe ser valido")]
        public string CN_PerEsDscr { get; set; }

        public static readonly byte Inactivo = 0;
        public static readonly byte Activo = 1;

        // Tablas de las que ponemos/participa (PUT) obtiene 1 a varios
        public ICollection<CN_EmpresaPeriodo> CN_EmpresaPeriodo { get; set; }
    } 

我检查了返回对象“ cN_EmpresaPeriodo”,并且有效,我不知道 为什么我会收到此错误。

感谢您的帮助!!

PS:所有这些都是在开发人员模式下发生的,我的意思是我是唯一测试网络的人。 因此,每次我编辑一个项目时,“ catch(DbUpdateConcurrencyException ex)”都会触发,例如是否删除了记录,但并非如此,这可能是什么问题?

0 个答案:

没有答案