我使用 Northwind 数据库作为这篇文章的示例,我在使用实体框架将分离的实体保存回数据库时遇到问题。
我有以下两种方法来获取领土和地区:
static List<Region> GetRegions()
{
using (NorthwindEntities entities = new NorthwindEntities())
{
entities.Region.MergeOption = System.Data.Objects.MergeOption.NoTracking;
return entities.Region.ToList();
}
}
static List<Territories> GetTerritories()
{
using (NorthwindEntities entities = new NorthwindEntities())
{
entities.Territories.MergeOption = System.Data.Objects.MergeOption.NoTracking;
return entities.Territories.ToList();
}
}
这些方法都可以正常工作,并让我在分离状态下获得我需要的对象集合。
我还有一个名为 SaveEntity 的静态方法,它同时接受旧实体和当前编辑的实体,如下所示:
static void SaveEntity(EntityObject oldEntity, EntityObject newEntity)
{
using (NorthwindEntities entities = new NorthwindEntities())
{
entities.Attach(oldEntity);
entities.ApplyPropertyChanges(newEntity.EntityKey.EntitySetName, newEntity);
entities.SaveChanges();
}
}
此方法部分适用于对对象的更改保存到数据库的情况,但不会保存对相关对象关系的任何更改。
我有以下代码调用上述方法作为我的示例:
List<Territories> territories = GetTerritories();
List<Region> regions = GetRegions();
Region region = regions.Where(n => n.RegionID == 2).FirstOrDefault();
Territories oldTerritory = territories.Where(n => n.TerritoryID == "01581").FirstOrDefault();
Territories newTerritory = ObjectCopier.Clone<Territories>(oldTerritory);
newTerritory.TerritoryDescription = "Hello World";
newTerritory.Region = region;
SaveEntity(oldTerritory, newTerritory);
对 TerritoryDescription 的更改已成功保存,但对 Region 的更改未成功保存,在数据库中它仍保持为 RegionID=1 而不是 RegionID=2。
谁能向我提供一些关于为什么 ApplyPropertyChanges 不传播对相关对象的更改的见解?
另外,有谁知道我如何解决这个问题?