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 请发布您的SaveDrink
actions 的视图 (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的主要内容,如果未能解决你的问题,请参考以下文章
EF Core Navigation Property Include 使用左连接而不是内连接
EF Core - 为啥 ClientSetNull 是可选关系的默认 OnDelete 行为(而不是 SetNull)
添加迁移时,IdentityServer DB 上的 EF Core 迁移适用于 MULTIPLE 表而不是仅 AspNetUsers 表