c# - 更新 Entity Framework 中的嵌套对象

标签 c# .net entity-framework entity-framework-6

最近我发现 EF 不更新嵌套对象。 几天来,我试图弄清楚如何做到这一点,但不幸的是,我遇到了这个问题。

我有对象

public class ProjectEntity : AuditableEntity<int>
{

    public string CustumerCompany { get; set; }
    public string CustomerRepresentative { get; set; }

    public string ProjectTitle { get; set; }
    public string WwsNumber { get; set; }

    [ForeignKey("ParentProjectId")]
    public virtual ProjectEntity ParentProject { get; set; }

    public int? ParentProjectId { get; set; }

    public virtual ICollection<ProjectServicesEntity> Service { get; set; }
}

然后是服务对象

public class ProjectServicesEntity : AuditableEntity<int>
{
    /// <summary>
    /// Service Number
    /// </summary>
    public int Number { get; set; }
    /// <summary>
    /// Service Name
    /// </summary>
    public string Name { get; set; }

    /// <summary>
    /// Positions
    /// </summary>
    public virtual ICollection<ProjectPositionsEntity> Positions { get; set; }

    [ForeignKey("ProjectId")]
    public virtual ProjectEntity Project { get; set; }

    public int ProjectId { get; set; }
}

和位置对象:

public class ProjectPositionsEntity : AuditableEntity<int>
{
    /// <summary>
    /// Position number
    /// </summary>
    public int Number { get; set; }

    /// <summary>
    /// Position Name
    /// </summary>
    public string Name { get; set; }

    /// <summary>
    /// Organization Unit for position
    /// </summary>
    public virtual ICollection<ProjectsOutsourcedPositionEntity> OrganizationUnit { get; set; }
    /// <summary>
    /// Represents if position is outsourced
    /// </summary>
    public bool OutSource { get; set; }
    /// <summary>
    /// Comments for position
    /// </summary>
    public string Remarks { get; set; }

    [ForeignKey("ServiceId")]
    public virtual ProjectServicesEntity Service { get; set; }

    public int ServiceId { get; set; }

}}

还有我的更新方法:

public void Update(T entity)
    {

            DbContext.Entry(entity).State = EntityState.Modified;
            DbContext.SaveChanges();
}

当页面显示所有数据时,当我尝试编辑服务或位置中的某些数据时,它不会更新。 有人遇到过这种问题吗?

我看到的每个示例都只有 1 层深的嵌套对象,但正如您所见,我的对象有 2 层嵌套。

最佳答案

所以我弄清楚了如何才能完成这项工作。 在特定的存储库类中,我做了几个 foreach 循环,将 EntityState 设置为已修改。根据我们的业务规则,Project 需要有 Service 和 Position,而 OrganizationUnit for Position 是可选的,所以我检查它是否不为空。 这是我的解决方案:

DbContext.Entry(entity).State = EntityState.Modified;
            foreach (var service in entity.Service)
            {
                DbContext.Entry(service).State = EntityState.Modified;
                foreach (var position in service.Positions)
                {
                    DbContext.Entry(position).State = EntityState.Modified;
                    if (position.OrganizationUnit == null) continue;
                    foreach (var organizationUnit in position.OrganizationUnit)
                    {
                        DbContext.Entry(organizationUnit).State = EntityState.Modified;
                    }
                }
            }
            DbContext.SaveChanges();

现在,当我想在任何级别更新我的对象时,它会在我的数据库中更新。

关于c# - 更新 Entity Framework 中的嵌套对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41739901/

相关文章:

.net - IEnumerable:在 OOP 的上下文中是什么意思

c# - 如何在 ASP .NET MVC 5 中为 AspNetUser 创建 SecurityStamp

C# 编译器期望右大括号

c# - XUnit 测试返回查看是否返回列表

c# - 如何删除 WPF 中 ListView 中显示的特定文本?

C# - .NET 和 CF.NET 的代码编译器

c# - 确定目录中的文件数

.net - 如何首先从数据库 EF 模型向现有代码添加其他表?

c# - 在 Configuration.cs 中播种数据,使用 AddOrUpdate 创建重复数据

c# - 无法加载ps1,因为此系统上禁用了运行脚本