首页 > 解决方案 > 实体框架核心不保存更改(没有主键,一个行表)

问题描述

我有一个遗留数据库,该表只有一行没有主键。当我尝试更新这一行时,什么也没有发生。我搜索了很多,来到了这行代码(dbf.Entry(nextPro).State = EntityState.Modified;)。当我添加此代码时,出现错误:“无法跟踪'NxtId'类型的实例,因为它没有主键。只能跟踪具有主键的实体类型。”

我无法删除该行并添加一个新行。我无法添加主键。我有唯一的选择以某种方式更新行。

var nextPro = dbf.NxtId.FirstOrDefault();

nextPro.ProductNo = 239071;
dbf.Entry(nextPro).State = EntityState.Modified;
dbf.SaveChanges();

实体:

public partial class NxtId
{
    public int? ProductNo { get; set; }
    public int? Uid { get; set; }
    [Key]
    public int? SatCode { get; set; }
}

标签: c#entity-framework-core

解决方案


当实体没有密钥时,您无法使用 Entity Framework 跟踪或更改实体。但是,您仍然可以从数据库中读取数据。此外,您可以使用扩展方法运行自定义手动编写的 SQL 查询RelationalDatabaseFacadeExtensions.ExecuteSqlRaw()。使用它发送一个普通UPDATE查询,然后再次从数据库中读取实体以获取新值。

dbf.Database.ExecuteSqlRaw($"UPDATE {nameof(NxtId)} SET {nameof(NxtId.ProductNo)} = {{0}}", 239071);
var nextPro = dbf.NxtId.Single();

推荐阅读