更新交易期间未按预期保存修改后的实体的当前值

问题描述

我有一个存储库,用于接收映射到数据访问对象(DAO)的域对象。为了更新实体,我删除了具有相同ID的实例并添加了映射的DAO,以避免两个实例具有相同的ID(映射的DAO和现有实体)。

实体(产品组)具有一对多配置中相同类型(子组)的实体的集合。该类具有集合导航属性(SubGroups),但没有“ SuperGroup”导航属性。这意味着EF跟踪阴影导航属性。此阴影导航属性是发生意外行为的地方。

我有一个包含子组B和C的产品组A。我在前端将其修改为具有子组C和D。更新操作后,产品组A仅具有子组D。当我在子组C的ChangeTracker条目中查找时,其原始值和新值都具有ProductGroup A的ID。

IsModified属性设置为true。我可以看到原因,因为在该操作中,首先删除了对ProductGroup A现有实例的引用,然后对新映射的DAO实例进行了“还原”。

我不明白的是为什么对SaveChanges()的调用导致子组C的影子SuperGroup属性值在其新值为A的ID时设置为null。

是否可能与产品组A分别具有子组B和C以及子组C和D的已删除条目和已添加条目有关?是否有解决删除和已添加条目的特殊顺序?还是我想念其他东西?

ProductGroup类:

    public class ProductGroup
    {
        public Guid Id { get; set; }

        public IList<ProductGroupName> Names { get; set; }

        public IList<ProductClassification> Products { get; set; }

        public IList<ProductGroup> SubGroups { get; set; }

        public IList<ProductGroupAsset> Assets { get; set; }
    }

存储库Save方法

        public void Save(IEnumerable<ProductGroup> productGroups)
        {
            foreach (var productGroup in productGroups)
            {
                var productGroupDao = MapToDataAccessproductGroup(productGroup);

                if (_domainDbContext.ProductGroup.Select(x => x.Id).Contains(productGroup.Id))
                {
                    var existingProductGroupDao = LoadProductGroupDaos(true).Single(x => x.Id == productGroup.Id);

                    _domainDbContext.ProductGroup.Remove(existingProductGroupDao);
                }

                SetotherRootsToExistingEntities(productGroupDao,productGroup);

                _domainDbContext.Add(productGroupDao);
            }

            _domainDbContext.SaveChanges();
        }

        private void SetotherRootsToExistingEntities(Dao.ProductGroup productGroupDao,ProductGroup productGroup)
        {
            SetProuctsToExistingProducts(productGroupDao,productGroup);

            SetSubgroupsToExistingSubgroups(productGroupDao,productGroup);
        }

        private void SetProuctsToExistingProducts(Dao.ProductGroup productGroupDao,ProductGroup productGroup)
        {
            for (var i = 0; i < (productGroup.Products?.Count ?? 0); i++)
            {
                var productId = productGroup.Products[i].Id;

                productGroupDao.Products[i].Product = _domainDbContext.Product.Single(x => x.Id == productId);
            }
        }

        private void SetSubgroupsToExistingSubgroups(Dao.ProductGroup productGroupDao,ProductGroup productGroup)
        {
            for (var i = 0; i < (productGroup.SubGroups?.Count ?? 0); i++)
            {
                var subgroupsId = productGroup.SubGroups[i].Id;

                productGroupDao.SubGroups[i] = _domainDbContext.ProductGroup.Single(x => x.Id == subgroupsId);
            }
        }

        private IEnumerable<Dao.ProductGroup> LoadProductGroupDaos(bool includeAssets = false)
        {
            var loadedDaos = _domainDbContext.ProductGroup
                .Include(x => x.Names)
                .Include(x => x.Products)
                    .ThenInclude(x => x.Product)
                .Include(x => x.SubGroups)
                    .ThenInclude(x => x.Names);

            if (includeAssets)
            {
                loadedDaos.Include(x => x.Assets);
            }

            return loadedDaos;
        }

SaveChanges()之前的

  • (已删除)产品组A和子组B和C
  • (已添加)具有子组C和D的产品组A
  • (已修改)具有SuperGroup阴影属性的子组B从A的ID设置为空
  • (已修改)具有SuperGroup阴影属性的子组C,其阴影属性从A的ID设置为A的ID(相同的值,但IsModified为true)
  • (已修改)子组D,其SuperGroup阴影属性从null设置为A的ID

解决方法

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

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

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