2017-01-19 13 views
0

最近、EFはネストされたオブジェクトを更新しないことを発見しました。 数日間、私はこれを行う方法を理解しようとしますが、残念ながら私はこの問題に固執しています。Entity Frameworkでネストされたオブジェクトを更新する

私は、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; } 
} 

サービス対象

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レベルのネストがあります。

+0

変更がページからサーバーに届いていますか?テストハーネス(コンソールアプリケーション)でこれを試しても、同じ動作をしますか?たとえば、いくつかのデータを読み込んでオブジェクトを変更し、保存する小さなコンソールアプリケーションを作成します。保存は機能しますか? –

+0

私はあなたが切断されたオブジェクトについて話していると思います。それは決してEFによって対処されていません、あなたは[GraphDiff](https://www.nuget.org/packages/RefactorThis.GraphDiff)パッケージを見ることができます。 –

+0

@AdamBensonはい、確信しています。問題は、EFはModifiedとマークされたEFオブジェクトのみを更新し、この状態は子オブジェクトには適用されないということでした。だから私は彼らのために変更を設定する必要があります。 私のソリューションを掲載しました –

答えて

1

私はこの作業をどのように行うことができるかを理解します。 特定のリポジトリクラスでは、私は少しだけ、EntityStateを変更するように設定したループをforeach作成しました。私たちのビジネスルールでは、サービスはPositionとOrganizationUnit for Positionを持っている必要があります。したがって、nullでないかどうかチェックします。私は、任意のレベルに私のオブジェクトを更新したいとき

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

は、今では私のDBに更新します: はここに私のソリューションです。

関連する問題