EF Core 调用 INSERT 而不是 UPDATE

Posted

技术标签:

【中文标题】EF Core 调用 INSERT 而不是 UPDATE【英文标题】:EF Core calls INSERT instead of 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 我在上面写道,我已经发现了一个错误。谢谢。 【参考方案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。

以上是关于EF Core 调用 INSERT 而不是 UPDATE的主要内容,如果未能解决你的问题,请参考以下文章

完整数据集而不是 Top 1000 EF Core

EF Core Navigation Property Include 使用左连接而不是内连接

EF Core - 为啥 ClientSetNull 是可选关系的默认 OnDelete 行为(而不是 SetNull)

添加迁移时,IdentityServer DB 上的 EF Core 迁移适用于 MULTIPLE 表而不是仅 AspNetUsers 表

EF Core 上下文不包含添加实体的更改

EF Core:检查 OnModelCreating 中是不是存在列以忽略属性