首页 > 解决方案 > 在将数据保存到多个表时无法跟踪实体类型的实例

问题描述

在这里,我试图在单次提交时将人员详细信息保存在Person表格中,并将人员相关文件保存到表格中。但是在提交时它显示错误说in line 。下面是我的代码和表结构PersonFileUpload

'The instance of entity type 'PersonFileUpload' cannot be tracked because another instance with the same key value for {'FileId'} is already being tracked. uow.Repository<Person>().Add(person);



 public Person PersonModel { get; set; } = new Person();
    IReadOnlyList<IBrowserFile> selectedFiles;
    public void postPerson()
    {
        List<PersonFileUpload> fileList = new List<PersonFileUpload>();
        foreach (var file in selectedFiles)
        {               
            fileList.Add(new PersonFileUpload() { UploadedFileName = file.Name });
            
        }
        PersonModel.PersonFileUpload = fileList;
        mainService.SavePerson(PersonModel);           
    }

public void SavePerson(Person person)
    {
        if (person.PersonId == 0)
        {
            uow.Repository<Person>().Add(person);
            uow.Commit();
        }
        else
        {
            uow.Repository<Person>().Edit(person);
            uow.Commit();
        }
    }

人表

public partial class Person
{
    public Person()
    {
        PersonFileUpload = new HashSet<PersonFileUpload>();
    }

    public int PersonId { get; set; }
    public string FullName { get; set; }
    public string Email { get; set; }
    public string Address { get; set; }
    public int? CountryId { get; set; }
    public int? CityId { get; set; }
    public virtual ICollection<PersonFileUpload> PersonFileUpload { get; set; }
}


PersonFileUpload 表

public partial class PersonFileUpload
{
    public int FileId { get; set; }
    public int? PersonId { get; set; }
    public string UploadedFileName { get; set; }
    public virtual Person Person { get; set; }
}

标签: c#asp.net-mvcentity-frameworkasp.net-coreblazor-server-side

解决方案


您的代码中可能有多种原因/位置导致此问题。简而言之,您的数据库上下文跟踪了多个 PersonFileUpload 实例,其中一个实例可能是您获取这些对象时,而另一个实例是您尝试保存它们时。几乎没有立即想到的原因,但是如果没有您提供的更多代码,则无法确定是哪一个。由于您似乎显然正在使用工作单元,我猜您正在获取 PersonFileUpload 文件,这些文件在您为您的人调用 Add 之前仍由您的上下文跟踪。

当您获取您的 PersonFileUpload 实体时,您可以尝试执行下一步:

尝试使用 AsNoTracking:

var fileUploads = dbContext.PersonFileUploads.AsNoTracking().Where(...).ToList();

或者您可以对 PersonFileUpload 实体使用 Detach:

dbContext.Entry(fileUploadEntity).State = EntityState.Detached

推荐阅读