繁体   English   中英

使用 EF 核心中的 Entry() 方法更新数据

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM