如何添加实体的状态但调用 CallTracker.HasChanges() 返回 false?

问题描述

我使用的是 EF Core 5.0。

我有一个名为 JobApplicationManager 的类,它拥有 JobApplications 的多个()。

        modelBuilder.Entity<JobApplicationManager>().OwnsMany(s => s.JobApplicationCategories,a =>
       {
           a.Property<DateTime>("CreatedDate");
           a.Property<DateTime>("UpdatedDate");
           a.ToTable("JobApplicationManagerCategories");
       });

        modelBuilder.Entity<JobApplication>().OwnsMany(s => s.JobApplicationCategories,a =>
        {
            a.Property<DateTime>("CreatedDate");
            a.Property<DateTime>("UpdatedDate");
            a.ToTable("JobApplicationCategories");
        });

当前状态:DB中有一个JobApplicationManager,一个JobApplication。 操作:我将另一个 JobApplication 添加到 JobApplicationManager。

在我的 DBContext.SaveChangesAsync() 中,我调用 ChangeTracker.Entries(),以下是实体:

enter image description here

如您所见,第一个条目是状态为“已添加”的 JobApplication。

enter image description here

同样在这个 DBContect 中你可以看到 JobApplicationManager 有两个 JobApplications:

enter image description here

下一步我可以 ChangeTracker.HasChanges() 返回 false,因此 base.SaveChangesAsync() 返回 0 个写入的实体。

我不知道该怎么办。

这是创建我的实体并调用我的存储库的代码

        var mgr = await AMRepository.GetJobApplicationManagerAsync(command.JobApplicationManagerID);
       var newJobApplication = mgr.AddJobApplication(command.JobDescriptionURL,command.JobTitle,command.FileName,command.CompanyName,command.GeographicLocation,command.RecruiterName,command.JobApplicationCategories);

        // Update the Repository
        AMRepository.Update(mgr);

        commandResult = await AMRepository.UnitOfWork.SaveEntitiesAsync(cancellationToken);

这是我存储库中的代码

        public void Update(JobApplicationManager applicationManager)
    {
        try
        {
            AppManagerContext.Entry(applicationManager).State = EntityState.Modified;

    }

这是我的 DBContext 中 SaveEntitiesAsync() 的代码

public async Task<bool> SaveEntitiesAsync(CancellationToken cancellationToken = default(CancellationToken))
        {
            var changesFlag1 = ChangeTracker.HasChanges();

            // Dont save the enumeration Value Object types
            try
            {               
                var enumerationEntries = ChangeTracker.Entries()
                        .Where(x => EnumerationTypes.Contains(x.Entity.GetType()));

                foreach (var enumerationEntry in enumerationEntries)
                {
                    enumerationEntry.State = EntityState.Unchanged;
                }
            }
            catch (Exception exc)
            {
                Console.WriteLine(exc.ToString());
            }

            UpdateShadowProperties();

            var numberOfStateEntitiesWritten = 0;
            try
            {
                numberOfStateEntitiesWritten = await base.SaveChangesAsync(cancellationToken);
            }
            catch (dbupdateException exc)
            {
                Console.WriteLine(exc.ToString());
            }

            if (numberOfStateEntitiesWritten == 0)
            {
                return false;
            }

            return true;
        }

这是来自 Repository 的 GetJobApplicationManagersAsync() 代码

public async Task<IEnumerable<JobApplicationManager>> GetJobApplicationManagersAsync() => await AppManagerContext.JobApplicationManagers.ToListAsync();

在 mgr.AddApplication() 中,我所做的就是将 POCO 类添加到 mgr。没有与基础设施相关的活动(即使用 DBContext)>

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)