【问题标题】:Entity Framework core doesn't save changes (no primary key, one row table)实体框架核心不保存更改(没有主键,一个行表)
【发布时间】:2020-06-17 13:36:55
【问题描述】:

我有一个旧数据库,其中的表只有 一行 没有主键。当我尝试更新这一行时,什么也没有发生。我搜索了很多,找到了这行代码(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; }
}

【问题讨论】:

  • 尝试禁用ChangeTracker
  • 如果我禁用 ChangeTracker,它如何知道有更新?我试图打开它(因为它没有保存更改),但我收到了解释为什么它没有保存更改的错误(没有主键)。
  • 如果表有另一列,您可以将其定义为 EF 中的键(如添加 [Key] 属性)。如果你只有一行,它甚至会是独一无二的。
  • 我将 [Key] 注释添加到另一个不变的列中。它没有帮助。仍然得到:无法跟踪“NxtId”类型的实例,因为它没有主键。只能跟踪具有主键的实体类型。
  • 这篇文章可能对你有帮助 stackoverflow.com/questions/15381233/….

标签: c# entity-framework-core


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    适合我的代码(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();
            }
    

    【讨论】:

      猜你喜欢
      • 2018-09-24
      • 2017-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-29
      相关资源
      最近更新 更多