保存对分离状态下相关对象的更改

我正在使用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);

对TerritoryDe​​scription的更改已成功保存,但对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();
        }
    }

我在记事本上编写了这个代码,所以可能会有错误; 如果有任何请评论,所以我会相应更新。


我想你可以在这里找到答案(亚历克斯詹姆斯是更好的)。 使用相关实体更新实体框架

基本上,原因是因为在EF关系中,对象也是对象,并且具有像实体一样的状态(删除,添加...),因此您需要在上下文中也有原始参考值。

链接地址: http://www.djcxy.com/p/873.html

上一篇: Saving Changes to Related Objects in Detached State

下一篇: Tag messages on github