簡體   English   中英

實體框架 - 保存對分離狀態中相關對象的更改

[英]Entity Framework - Saving Changes to Related Objects in Detached State

我正在使用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關系中也是對象,並且具有像實體(刪除,添加,......)這樣的狀態,因此您還需要在上下文中具有原始引用值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM