2017-12-03 7 views
2

나는 데이터베이스를 처리하는 엔티티 프레임 워크를 사용하고, 나는 다음과 같은 모델을 자기 - 참조했다 : I가 연결 그래프를 업데이트 할 GraphDiff 라이브러리를 사용했다Entity Framework를 사용하여 자체 참조 그래프를 업데이트하는 방법은 무엇입니까?

public class PhysicalObject 
{ 
    public PhysicalObject() 
    { 
     SubPhysicalObjects = new HashSet<PhysicalObject>(); 
    } 

    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 

    public int? ParentId { get; set; } 

    [StringLength(150)] 
    public string Title { get; set; } 

    public virtual PhysicalObject Parent { get; set; } 

    public virtual ICollection<PhysicalObject> SubPhysicalObjects { get; set; } 

} 

하지만 자기를 업데이트 지원하지 않는 것 같습니다 그래프를 참조합니다.

내 질문은 : 존재하지 않는 physicalObjects

삽입

  • 삭제/업데이트 기존 physicalObjects

  • : 무엇에 의해 엔티티 프레임 워크를 사용하여 자체 참조 그래프를 업데이트하는 가장 좋은 방법입니다

답변

0

다음 두 엔티티가 있다고 가정 해 보겠습니다.

public class PhysicalObject 
{ 

    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 

    public int? ParentId { get; set; } 

    public int StorageRequestId { get; set; } 

    public string Title { get; set; } 

    public virtual PhysicalObject Parent { get; set; } 

    public virtual ICollection<PhysicalObject> SubPhysicalObjects { get; set; } 

    public virtual StorageRequest StorageRequest { get; set; } 

} 

public class StorageRequest 
{ 
    public StorageRequest() 
    { 
     PhysicalObjects = new HashSet<PhysicalObject>(); 
    } 

    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 

    public string Title { get; set; } 

    public virtual ICollection<PhysicalObject> PhysicalObjects { get; set; } 
} 

PhysicalObject는 자체 참조 테이블입니다.

var oldPhysicalObjects = dbContext.PhysicalObjects.Where(x => x.StorageRequestId== storageRequestId).ToList(); 

var existingIds = new HashSet<int>(); 
foreach (var item in newGraphDto.PhysicalObjects.ToList()) 
    { 
    updateGraph(item, oldPhysicalObjects, dbContext, storageRequestId,existingIds); 
    } 
var posToDelete = oldPhysicalObjects.Where(x => existingIds.All(e => e != x.Id)).ToList(); 
dbContext.PhysicalObjects.RemoveRange(posToDelete); 
dbContext.SaveChanges(); 

updateGraph 방법은 재귀 PhysicalObjects의 모든 나무를 업데이트하고 것 같습니다 : 나는 내 코드는 방법을 알고 다른 사람을 도움이되기를 바랍니다

private void updateGraph(PhysicalObjectDto physicalObjectDto, IList<PhysicalObject> oldPhysicalObjects, MyDbContext dbContext, int storageRequestId, HashSet<int> existingIds, PhysicalObject parent = null) 
    { 
     if (physicalObjectAddEditDto.Id == 0) 
     { 
      PhysicalObject po = new PhysicalObject 
      { 
       Id = physicalObjectAddEditDto.Id, 
       Title = physicalObjectAddEditDto.Title, 
       StorageRequestId = storageRequestId, 
       Parent=parent 

      }; 

      dbContext.PhysicalObjects.Add(po); 

      parent = po; 
     } 
     else 
     { 
      var po = oldPhysicalObjects.FirstOrDefault(x => x.Id == physicalObjectAddEditDto.Id); 
      po.Title = physicalObjectAddEditDto.Title; 
      po.StorageRequestId = storageRequestId; 
      po.Parent = parent; 
      dbContext.Entry(po).CurrentValues.SetValues(po); 

      parent = po; 
     } 


     existingIds.Add(parent.Id); 
     foreach (var subPhysicalObject in physicalObjectAddEditDto.SubPhysicalObjects) 
     { 
      updateGraph(subPhysicalObject, oldPhysicalObjects, dbContext, mailRoomRequestId, existingIds, parent); 
     } 

    } 

엔티티 프레임 워크를 사용하여

하지 말자의 업데이트 그래프 자체 참조 테이블의 그래프 트리를 업데이트하는 방법