实体框架核心不保存更改(无主键,一个行表)

时间:2020-06-17 13:36:55

标签: c# entity-framework-core

我有一个旧数据库,该表的表只有一行,没有主键。当我尝试更新此行时,没有任何反应。我进行了很多搜索,找到了这行代码(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; }
}

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

最适合我的代码(Entity Framework Core不喜欢与原始sql一起使用)。所以我不得不找到一个仍然有效的命令。

        using (SqlConnection connection = new SqlConnection(Configuration["ConnectionStrings:Test"]))
        {
            SqlCommand command = new SqlCommand("UPDATE dbo.NxtID SET ProductNo =" + newProductNo, connection);
            command.Connection.Open();
            command.ExecuteNonQuery();
        }