c# - Entity Framework - 在分离状态下保存对相关对象的更改

标签 c# entity-framework northwind

我使用 Northwind 数据库作为这篇文章的示例,我在使用 Entity Framework 将分离的实体保存回数据库时遇到问题。

我有以下两种方法来获取领土和地区:

    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();
        }
    }

我已经在记事本上编码了,所以可能会有错误;如果有的话请评论,我会相应地更新。

关于c# - Entity Framework - 在分离状态下保存对相关对象的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1696641/

相关文章:

c# - 创建 Photoshop 风格的 float 工具调色板

c# - Linq 按日期和时间分组顺序

c# - 从 Controller 导出数据到 CSV

ASP.NET MVC - 根据上一篇文章对论坛主题进行排序

c# - 在不迭代的情况下将对象集合添加到另一个对象集合

sql-server - SQL Server 2008 的示例数据库

c# - MasterPage 上的 ASP.Net MVC 身份验证检查

entity-framework - Entity Framework 优化include,提供Inclusion提示

sql - 查询简化 Oracle Northwind

Northwind 数据库安装错误 : Msg 2812, 级别 16,状态 62,第 1 行找不到存储过程 'U'