c# - 当 IDENTITY_INSERT 设置为 OFF 时,无法在 TABLE 中插入标识列的显式值; .NET核心2.1

标签 c# .net entity-framework-core

我正在尝试克隆 EF Core 中的实体。据我了解,我需要检索它们 AsNoTracking 然后重新添加它们,但是当我这样做时,我收到错误:

Cannot insert explicit value for identity column in Exercises when IDENTITY_INSERT is set to OFF;

我向 Id 添加了数据注释:[DatabaseGenerate(DatabaseGenerateOption.Identity)],但仍然遇到相同的错误。

这是我的代码:

public class Exercise : Entity
{
    public Exercise()
    {
        Sets = new HashSet<Set>();
    }       

    public DateTime Date { get; set; }

    public int MuscleGroupId {get;set;}

    public int MesoId { get; set; }

    public ICollection<Set> Sets { get; set; }

    public void AddSet(Set set)
    {
        Sets.Add(set);
    }
}

这是我的实体代码,我设置了一个注释,告诉 EF Core ID 是数据库生成的:

 public class Entity
 {
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
 }

这是克隆实体的代码:

 var exercises = _context.Exercises.AsNoTracking().Include(y => y.Sets)
.Where(x => x.MesoId == mesoId && x.Date == fromDate);

 foreach (var exercise in exercises)
   {
      exercise.Date = toDate;
      _context.Exercises.Add(exercise);
   }

 await _context.SaveChangesAsync();

最佳答案

您无法将值存储到数据库的 Identity 列中,因为该值由数据库本身管理。

“克隆”锻炼记录时,您需要设置 Id=0,以便在插入新行时数据库将为它创建 Identity 值,例如:

foreach (var exercise in exercises)
{
   exercise.Date = toDate;
   exercise.Id = 0; //<<--This is important!
   _context.Exercises.Add(exercise);
}
await _context.SaveChangesAsync();

关于c# - 当 IDENTITY_INSERT 设置为 OFF 时,无法在 TABLE 中插入标识列的显式值; .NET核心2.1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57838277/

相关文章:

c# - .NET 编写 PCAP 文件

c# - Entity Framework Core 2.0 自动增量和主键映射

Visual Studio 2017 中缺少 SQLite 数据提供程序

c# - C 到 C# PInvoke 带指针的结构

c# - 日期时间格式为 20131205205​​012.000000-000

c# - Microsoft Graph API 如何创建不记名 msal token

c# - 为什么 Calli 比委托(delegate)调用更快?

.net - MySql DataTable的ForEach-Object循环第一行空白

sql-server - EF Core 替换所有相关子实体

c# - 反射中的 .NET Framework 程序集