简体   繁体   English

在实体框架中更新嵌套对象

[英]Updating Nested Objects in Entity Framework

recently I discover that EF doesn't update nested object. 最近,我发现EF不会更新嵌套对象。 For few days I try to figure out how to do this but unfortunately I'm stuck with this problem. 几天来,我试图弄清楚该如何做,但是不幸的是,我仍然坚持这个问题。

I have Object 我有对象

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

Then Service object 然后服务对象

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

and Positions object: 和排名对象:

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

}}

And my update method: 和我的更新方法:

public void Update(T entity)
    {

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

When have page were all data is represented and when I try to edit some data in Service's or in Position's it doesn't update. 当有页面时,所有数据都被表示,当我尝试在Service或Position中编辑一些数据时,它不会更新。 Anybody had this kind of problem ? 有人遇到这种问题吗?

Every example that I saw it was only with nested object that has 1 level deep but as you can see my object has 2 level nest. 我看到的每个示例都仅包含深度为1级的嵌套对象,但是如您所见,我的对象具有2级嵌套。

So I figure out how I can make this work. 因此,我想出了如何进行这项工作的方法。 In specific repository class I made few foreach loops that set EntityState to modified. 在特定的存储库类中,我进行了一些将EntityState设置为Modifyed的foreach循环。 By our business rules Project required to have Service and Position and OrganizationUnit for Position is optional so I check if it's not null. 根据我们的业务规则,要求具有“服务和职位”以及“职位的OrganizationUnit”的项目是可选的,因此我检查它是否不为null。 Here is my solution: 这是我的解决方案:

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

Now when I want to update my object on any level it will update in my DB. 现在,当我想在任何级别上更新对象时,它将在我的数据库中更新。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM