recently I discover that EF doesn't update nested object. 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. 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.
So I figure out how I can make this work.
In specific repository class I made few foreach
loops that set EntityState to modified. 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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With