Я использую базу данных 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 не распространяет изменения на связанные объекты?
Кроме того, кто-нибудь знает, как я могу обойти эту проблему?
Вместо того, чтобы выбирать регионы и территории отдельно, извлекайте их обоих в одном запросе. Что-то вроде (я предполагаю, что вы хотите обновить сущность, не хотите создавать новую);
static List<Region> GetTerritoriesWithRegions()
{
using (NorthwindEntities entities = new NorthwindEntities())
{
entities.Territories.MergeOption = System.Data.Objects.MergeOption.NoTracking;
return entities.Territories.Include("Region").ToList();
}
}
Затем обновите их следующим образом;
List<Territories> territoriesWithRegions = GetTerritoriesWithRegions();
Territories territory = territories.Where(n => n.TerritoryID == "01581").FirstOrDefault();
territory.TerritoryDescription = "Hello World";
Region region = territories.Where(p => p.Any(q => q.Region.RegionID == 2)).FirstOrDefault().Region;
territory.Region = region;
SaveEntity(territory);
И сохранить их;
static void SaveEntity(EntityObject entity)
{
using (NorthwindEntities entities = new NorthwindEntities())
{
entities.Attach(entity);
entities.Context.ObjectStateManager.ChangeObjectState(entity, EntityState.Modified);
entities.SaveChanges();
}
}
Я записал это в блокноте, так что могут быть ошибки; если таковые имеются, пожалуйста, прокомментируйте, поэтому я буду обновлять соответственно.