C# 当identity\u insert设置为OFF;时,无法在表中插入identity列的显式值。净核心2.1

C# 当identity\u insert设置为OFF;时,无法在表中插入identity列的显式值。净核心2.1,c#,.net,entity-framework-core,C#,.net,Entity Framework Core,我正在尝试克隆EF Core中的实体。据我所知,我需要以Notracking的形式检索它们,然后重新添加它们,但是当我这样做时,我得到了错误: 无法在练习中插入标识列的显式值 当IDENTITY_INSERT设置为OFF时 我在Id中添加了数据注释:[DatabaseGenerated(DatabaseGeneratedOption.Identity)],但仍然得到相同的错误 这是我的密码: public class Exercise : Entity { public Exercise

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

无法在练习中插入标识列的显式值 当IDENTITY_INSERT设置为OFF时

我在Id中添加了数据注释:
[DatabaseGenerated(DatabaseGeneratedOption.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);
    }
}
以下是克隆实体的代码:

 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();

不能将值存储到数据库中的标识列中,因为该值由数据库本身管理

“克隆”练习记录时,您需要设置
Id=0
,以便在插入新行时,数据库将为其创建标识值,例如:

foreach(练习中的var练习)
{
练习日期=今天;

exercise.Id=0;//不能将值存储到数据库中的标识列中,因为该值由数据库本身管理

“克隆”练习记录时,您需要设置
Id=0
,以便在插入新行时,数据库将为其创建标识值,例如:

foreach(练习中的var练习)
{
练习日期=今天;

exercise.Id=0;//您不能实际克隆
实体
行,因为
Id
是一个标识列。例如:插入新的
实体
行时,您不能提供
Id
值。如果将属性更改为
[DatabaseGenerated(DatabaseGeneratedOption.None)]
,会发生同样的错误:(我认为,如果您添加AsNoTracking,则确保EF将所有内容都视为新实体,然后我使用数据注释[DatabaseGenerated(DatabaseGeneratedOption.Identity)]添加它们,这样EF就不会尝试插入ID。@AlwaysLearning在执行
\u context.Exercises.add(exercise)之前,您需要将ID属性的值设置为0
@ChetanRanpariya问题是我必须沿着整个对象图将所有实体ID设置为0。我认为[DatabaseGenerated(DatabaseGeneratedOption.Identity)]注释可以防止我这样做。Sql server引发此异常,因为主键列已赋值。因此,除非将其设置为零,否则无法消除错误。您可以为图形中涉及的所有类编写克隆方法,并自顶向下调用它们,并复制除主键pr之外的所有属性属性。您不能实际克隆
实体
行,因为
Id
是一个标识列。例如:插入新的
实体
行时,您不能提供
Id
值。如果将属性更改为
[数据库生成(数据库生成选项.无)]
,会发生什么情况?我收到相同的错误:(我认为,如果您添加AsNoTracking,则确保EF将所有内容都视为新实体,然后我使用数据注释[DatabaseGenerated(DatabaseGeneratedOption.Identity)]添加它们,这样EF就不会尝试插入ID。@AlwaysLearning在执行
\u context.Exercises.add(exercise)之前,您需要将ID属性的值设置为0
@ChetanRanpariya问题是我必须沿着整个对象图将所有实体ID设置为0。我认为[DatabaseGenerated(DatabaseGeneratedOption.Identity)]注释可以防止我这样做。Sql server引发此异常,因为主键列已赋值。因此,除非将其设置为零,否则无法消除错误。您可以为图形中涉及的所有类编写克隆方法,并自顶向下调用它们,并复制除主键pr之外的所有属性问题是,我有一个集合的包含,所以我需要将每个集合都设置为set。Id=0,然后如果它们有关系,我也必须在整个对象图中为它们设置。有没有更简单的方法?问题是,我有一个集合的包含,所以我需要设置每个Set设置.Id=0,然后如果它们有关系,我也必须在整个对象图中为它们这样做。有更简单的方法吗?
 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();