【问题标题】:EF Core calls INSERT instead of UPDATEEF Core 调用 INSERT 而不是 UPDATE
【发布时间】:2021-10-20 20:22:01
【问题描述】:

我调用了 UPDATE,但添加了一个新行。为什么这可能?模型中的 ID 是正确的。即使我将纯粹的 Refresh 留在管理器中,它仍然会以这种方式发生。 型号:

public class Drink
    {    
        public Drink()
        {
            ImagesCount = 0;
            Hidden = false;
        }

        [DatabaseGenerated(DatabaseGeneratedOption.Identity), Key()]
        public int DrinkId { get; set; }
              
        public string Title { get; set; }       

        public int Price { get; set; }               

        public int ImagesCount { get; set; }

        public bool Hidden { get; set; }
    }

存储库:

public void Update(TEntity entity)
        {
           dbSet.Update(entity);
           context.SaveChanges();
        }

经理:

   public void SaveDrink(Drink drink)
            {
                if (drink.DrinkId != 0)
                {
                    drinkRepository.Update(drink);
                } else
                {
                    drinkRepository.Insert(drink);
                }
            }

【问题讨论】:

  • 您确定 DrinkId 不等于 0?
  • @DJ Burb 是的,我在编辑的时候做了ID输出,不是0。
  • 感谢您的帮助,我忘记在视图中添加带有 ID 的字段,它没有发送到 POST。已显示 GET ID。
  • @WebFR 请发布您的SaveDrinkactions 的视图 (cshtml) 文件代码。
  • @PritomSarkar 我在上面写道,我已经发现了一个错误。谢谢。

标签: asp.net-mvc entity-framework asp.net-core entity-framework-core


【解决方案1】:

您可以通过 ChangeTracker 检查实体的状态

public void Update(TEntity entity)
    {
       // ste breakpoint and check your entity status here
       var status = context.ChangeTracker.Entries();
       
       dbSet.Update(entity);
       context.SaveChanges();
    }

可能你的实体没有被ChangeTracker跟踪,这种情况下,你需要将实体状态设置为Modified。

 DbSet.Attach(entity);
 var entry = Context.Entry(entity);
 entry.State = System.Data.EntityState.Modified;

【讨论】:

  • 感谢您的帮助,我忘记在视图中添加带有 ID 的字段,它没有发送到 POST。已显示 GET ID。
猜你喜欢
  • 1970-01-01
  • 2012-06-16
  • 1970-01-01
  • 2018-08-31
  • 1970-01-01
  • 2013-10-11
  • 1970-01-01
  • 1970-01-01
  • 2012-03-22
相关资源
最近更新 更多