[英]Update Data With Entry() Method In EF core
我在异步方法中的 ef core 中使用 entry 方法编辑数据。 但是当程序到达入口方法时抛出异常。 异常消息:
System.InvalidOperationException: '实体类型的实例
无法跟踪“clinicSpecifications”,因为已经在跟踪另一个具有相同 {'clinicSpecificationsID'} 键值的实例。 附加现有实体时,请确保仅附加一个具有给定键值的实体实例。 考虑使用“DbContextOptionsBuilder.EnableSensitiveDataLogging”来查看冲突的键值。
这是我的行动:
[HttpPost("updateClinicSpecifications")]
public async Task<IActionResult> updateData(clinicSpecifications clinicSpecificationsParam, clinicOpeningHours clinicOpeningHoursParam)
{
if (clinicSpecificationsParam.isActive == true)
{
await ClinicSpecificationsRepository.disableAllClinicAddress();
//update AllAddress To Disable this update working correctly
await ClinicSpecificationsRepository.saveChanges();
}
clinicSpecificationsParam.createDate = DateTime.Now.toShamsi();
clinicOpeningHoursParam.createDate = DateTime.Now.toShamsi();
//but when program reaches to this update exception is throws
bool result = await ClinicSpecificationsRepository.editclinicSpecifications(clinicSpecificationsParam);
bool result2 = await ClinicOpeningHoursRepository.editClinicOpeningHours(clinicOpeningHoursParam);
if (result == true)
{
await ClinicSpecificationsRepository.saveChanges();
}
if (result2 == true)
{
await ClinicOpeningHoursRepository.saveChanges();
}
return RedirectToAction("Index");
}
这是 disableAllClinicAddress 方法:
public async Task disableAllClinicAddress()
{
var allAddress = await getAllClinicSpecifications();
foreach (var item in allAddress)
{
item.isActive = false;
await editclinicSpecifications(item);
}
}
和我的更新方法:
public async Task<bool> editclinicSpecifications(clinicSpecifications clinicSpecifications)
{
try
{
await Task.Run(() => db.Entry(clinicSpecifications).State = EntityState.Modified);
return true;
}
catch (Exception)
{
return false;
}
}
请帮助我谢谢。
在您的更新方法中,避免使用 EntityState.Modified。 我知道这是一个有效的命令,但您可以看到您遇到了问题。 您必须首先通过执行 find 或 firstordefault 来跟踪有问题的条目以收集记录。 然后您可以修改记录并重新保存。 这是我头脑中的一些代码,但未经测试。
var entry = db.ClinicSpecifications.FirstOrDefault(c => c.Id);
entry.Field = clinicSpecification.Field;
db.SaveChanges();
又是一个粗略的例子,但它完美无缺。
我在异步方法中的 ef core 中使用 entry 方法编辑数据。 但是当程序到达入口方法时抛出异常。 异常信息
因为您正在创建一个新实例(未跟踪)而不是更新现有实例(已跟踪)。更改如下:
var clinicSpecificationsParam = _dbcontext.clinicSpecifications.Find(id);
这是我测试的一个工作演示:
1.型号:
public class clinicSpecifications
{
public int Id { get; set; }
public bool isActive { get; set; }
public DateTime createDate { get; set; }
}
2.控制器:
public class HomeController : Controller
{
private readonly YourContext _context;
public HomeController(YourContext context)
{
_context = context;
}
[HttpPost("updateClinicSpecifications")]
public async Task<IActionResult> updateData(int id)
{
var clinicSpecificationsParam = _context.clinicSpecifications.Find(id);
if (clinicSpecificationsParam.isActive == true)
{
await disableAllClinicAddress();
await _context.SaveChangesAsync();
}
clinicSpecificationsParam.createDate = DateTime.Now;
bool result = await editclinicSpecifications(clinicSpecificationsParam);
//...
return RedirectToAction("Index");
}
public async Task disableAllClinicAddress()
{
var allAddress = _context.clinicSpecifications.ToList();
foreach (var item in allAddress)
{
item.isActive = false;
await editclinicSpecifications(item);
}
}
public async Task<bool> editclinicSpecifications(clinicSpecifications clinicSpecifications)
{
try
{
await Task.Run(() => _context.Entry(clinicSpecifications).State = EntityState.Modified);
return true;
}
catch (Exception)
{
return false;
}
}
3.数据库上下文:
public class YourContext : DbContext
{
public YourContext (DbContextOptions<YourContext> options)
: base(options)
{
}
public DbSet<clinicSpecifications> clinicSpecifications { get; set; }
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.