gpt4 book ai didi

c# - 在 Entity Framework Core 中复制整行

转载 作者:行者123 更新时间:2023-11-30 15:16:28 25 4
gpt4 key购买 nike

我正在尝试从数据库中检索一行,更改其中的某些列值并将其添加为新行(Entity Framework Core),

但是它给我错误

Cannot insert explicit value for identity column in table 'Audit_Schedules' when IDENTITY_INSERT is set to OFF.

这个表有一个主键“ScheduleId”

下面是我的代码

 AuditSchedules _schedules = new AuditSchedules();
using (var ctx = new QuestionnaireEntities(_configuration))
{
_schedules = ctx.AuditSchedules.Where(x => x.ScheduleId == model.ScheduleID).SingleOrDefault();
_schedules.StaffId = model.TransferedAuditorCode;
_schedules.StaffName = model.TransferedAuditorName;
_schedules.FromDate = _schedules.ToDate = Convert.ToDateTime(model.TransferedScheduleDate);
ctx.AuditSchedules.Add(_schedules);
ctx.SaveChanges();

_subschedules = ctx.AuditSubSchedule.Where(x => x.SubScheduleId == model.SubScheduleID).SingleOrDefault();
_subschedules.IsHoliDay = "Y";
_subschedules.HolidayType = model.HolidayType;
_subschedules.TransferedScheduleId = _schedules.ScheduleId.ToString();
ctx.AuditSubSchedule.Update(_subschedules);
ctx.SaveChanges();
}

错误进来

ctx.AuditSchedules.Add(_schedules);

首先我认为它与 Schedule_ID 的值冲突并且无法添加重复的主键,但是 Schedule_ID 是自动生成的字段所以这个问题应该不会发生

我也试过设置不同的值

_schedules.ScheduleId = 0;

但它不插入 .我如何复制一行,其中几乎没有变化(想要添加一个新行但修改了值)

最佳答案

插入时自动生成值的 EF Core 行为与 EF6 不同。

首先,该属性必须具有默认值 (0) 才能自动生成。这允许标识插入,这在 EF6 中是不可能的。

其次,被添加的实体不应该已经被上下文跟踪,否则上下文会在内部保留一些信息,表明实体键已经设置,并将包含值(甚至是 0)生成的 INSERT 命令,这反过来会导致您遇到异常。

为实现目标,调用Add 方法之前:

首先使用 No-tracking query 确保实体未被跟踪获得时

_schedules = ctx.AuditSchedules
.AsNoTracking() // <--
.Where(x => x.ScheduleId == model.ScheduleID)
.SingleOrDefault();

或显式分离

ctx.Entry(_schedules).State = EntityState.Detached;

然后重置PK

_schedules.ScheduleId = 0;

做其他修改,最后调用

ctx.AuditSchedules.Add(_schedules);

这适用于没有导航属性/FK 的简单实体。对于复杂的实体图,您应该不使用跟踪查询,然后以与分离实体图相同的方式使用它。

关于c# - 在 Entity Framework Core 中复制整行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49378462/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com