System.InvalidOperationException(同一类型的另一个实体已具有相同的主键值

时间:2018-05-03 19:25:30

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

This is my Master Table
 [Key]
    public int ID { get; set; }
    [Required]
    public string Description { get; set; }
    [Display(Name = "Discontinue")]
    public bool IsDeleted { get; set; }
[Required]
    [Display(Name = "Created By")]
    public virtual ApplicationUser CreatedById { get; set; }
    //[Required]
    [Display(Name = "Created By DateTime")]
    public DateTime? CreatedByDateTime { get; set; }
    //[Required]
    [Display(Name = "Modified By")]
    public virtual ApplicationUser ModifiedById { get; set; }
    //[Required]
    [Display(Name = "Modified By Datetime")]
    public DateTime? ModifiedByDatetime { get; set; }

在我的主控制器中,我有一个创建方法,此方法将保存CREATEDBYID = USERID以及另外CREATEDBTDATETIME

[HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create([Bind(Include = "ID,Description,IsDeleted,CreatedByDateTime,ModifiedByDatetime")] Master master)
    {
        ModelState["CreatedById"].Errors.Clear();
        if (ModelState.IsValid)
        {
            master.CreatedById = db.Users.Find(User.Identity.GetUserId()); 
            master.CreatedByDateTime = DateTime.Now;
            db.Master.Add(master);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        return View(master);
    }

第二种编辑方法,此方法将获取修改记录并将其存储在modifiedbyid中的人的userId

[HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Edit([Bind(Include = "ID,Description,CreatedByDateTime,CreatedById,IsDeleted")] Master master)
    {
        //var count = ViewData.ModelState.Values.Where(v => v.
        if (ModelState.IsValid)
        {
            master.ModifiedByDatetime = DateTime.Now;
            master.ModifiedById = db.Users.Find(User.Identity.GetUserId());
            db.Entry(master).State = EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        return View(master);
    }

在网站上,我可以更改说明并删除字段其他列被隐藏但是当我点击保存时此错误显示

System.InvalidOperationException   的HResult = 0x80131509   Message =附加类型为' CleaningSupplies.Database.Models.ApplicationUser'的实体。失败,因为同一类型的另一个实体已具有相同的主键值。使用'附加'方法或将实体的状态设置为“未更改”#39;或者'修改'如果图中的任何实体具有冲突的键值。这可能是因为某些实体是新的并且尚未收到数据库生成的键值。在这种情况下,请使用'添加'方法或“添加”#39;实体状态跟踪图形,然后将非新实体的状态设置为“未更改”。或者'修改'作为适当的。   源=的EntityFramework

1 个答案:

答案 0 :(得分:0)

当您传入该对象时,它会创建一个新对象。您应该使用ID查询数据库以从数据库获取对象,然后保存它。否则,您尝试使用与数据库中已存在的密钥相同的密钥保存新对象,并将收到错误。所以我上周做的一个项目的例子是

var roomModels = await db.RoomModels.FindAsync(id);

这个变量" roomModels"是可以保存回数据库的引用。但要小心,因为这意味着你有两个对象,一个被传递到控制器,另一个需要保存回数据库。