问题描述
我有一个存储库,用于接收映射到数据访问对象(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()之前的
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)