System.InvalidOperationException (другая сущность того же типа уже имеет то же значение первичного ключа - PullRequest
0 голосов
/ 03 мая 2018
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);
    }

И второй метод редактирования, этот метод получит идентификатор пользователя, который изменил запись, и сохранит ее в модифицированном виде

.
[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 Сообщение = Присоединение объекта типа «CleaningSupplies.Database.Models.ApplicationUser» завершилось неудачно, поскольку другой объект того же типа уже имеет то же значение первичного ключа. Это может произойти при использовании метода «Присоединить» или установке состояния объекта на «Неизменено» или «Изменено», если какие-либо объекты в графе имеют конфликтующие значения ключей. Это может быть потому, что некоторые объекты являются новыми и еще не получили сгенерированные базой данных значения ключей. В этом случае используйте метод «Добавить» или состояние объекта «Добавлено» для отслеживания графика, а затем установите состояние не новых объектов на «Неизмененные» или «Измененные», в зависимости от ситуации. Источник = EntityFramework

1 Ответ

0 голосов
/ 03 мая 2018

Когда вы передаете этот объект, он создает новый объект. Вы должны запросить базу данных с идентификатором, чтобы получить объект из базы данных, а затем сохранить его. В противном случае вы пытаетесь сохранить новый объект с тем же ключом, что и в базе данных, и получите ошибку. Итак, пример из проекта, который я сделал на прошлой неделе:

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

эта переменная "roomModels" является ссылкой, которую можно сохранить обратно в базу данных. Будьте осторожны, поскольку это означает, что у вас есть два объекта, один из которых был передан в контроллер, а другой - вам необходимо сохранить обратно в базу данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...