C# 当identity\u insert设置为OFF;时,无法在表中插入identity列的显式值。净核心2.1
我正在尝试克隆EF Core中的实体。据我所知,我需要以Notracking的形式检索它们,然后重新添加它们,但是当我这样做时,我得到了错误: 无法在练习中插入标识列的显式值 当IDENTITY_INSERT设置为OFF时 我在Id中添加了数据注释: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
[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();