【问题标题】:System.InvalidOperationException (another entity of the same type already has the same primary key valueSystem.InvalidOperationException(同一类型的另一个实体已经具有相同的主键值
【发布时间】:2018-10-14 05:01:46
【问题描述】:
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 AND ALSO 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);
    }

还有第二种编辑方法,这个方法会获取修改记录的人的userId,并保存在modifiedbyid中

[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 H结果=0x80131509 Message=附加类型为“CleaningSupplies.Database.Models.ApplicationUser”的实体失败,因为同一类型的另一个实体已经具有相同的主键值。如果图中的任何实体具有冲突的键值,则在使用“附加”方法或将实体的状态设置为“未更改”或“已修改”时,可能会发生这种情况。这可能是因为某些实体是新实体,尚未收到数据库生成的键值。在这种情况下,使用“添加”方法或“添加”实体状态来跟踪图形,然后将非新实体的状态适当地设置为“未更改”或“已修改”。 来源=实体框架

【问题讨论】:

  • 能否提供Master实体查询在GET方法中的使用方式?有可能您在 GET 方法中查询 Master 实体,然后忘记使用 EntityState.DetachedAsNoTracking() 或只是在保存前重新附加实体。

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


【解决方案1】:

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

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

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

【讨论】:

  • 不,这是关于附加两个具有相同主键的实体对象。尚未涉及数据库。
猜你喜欢
  • 2017-08-10
  • 2015-01-08
  • 2014-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-13
  • 1970-01-01
相关资源
最近更新 更多