1

웹 API를 통해 CRUD 메서드를 제공하는 ASP.Net MVC 6/ASP.Net Core 1.0을 기반으로하는 응용 프로그램이 있습니다.Entity Framework 7.0.0-rc1/EntityFrameworkCore 1.0.0을 사용하여 하위 엔터티 차등 저장

Entity Framework 7.0.0-rc1을 사용하고 있습니다. 모든 것을 EF Core 1.0/ASP.Net Core 1.0으로 마이그레이션 할 계획이지만 아직 수행하지 않았습니다. 여기

은 나에게 설계 문제가 발생 모델의 유형의 조각의 모든 관계를 제대로 내 ApplicationContext 클래스에서 보장하는

public class ParentEntity 
{ 
    public int Id { get; set; } 
    public virtual ICollection<ChildEntity> ChildCollection { get; set; } = new ChildCollection(); 
} 

public class Child 
{ 
    public int Id { get; set; } 
    public virtual ParentEntity ParentEntity { get; set; } 
    public int? ParentEntityId { get; set; } 
} 

을, 모든 CRUD 작업은의를 추가 및 업데이트를 포함하여, 예상대로 작동 ParentEntity가 저장 될 때 하위 엔터티

// On some web API Save method : 
[HttpPost] 
public JsonResult Save(ParentEntity entity) 
{ 
    if (entity.Id > 0) _context.Update(entity); 
    else _context.Add(entity); 
    var result = _context.SaveChanges(); 
    return Json(result); 
} 

저장 방법에 전달 된 개체 내 AngularJS와 백엔드에서 오는 :

예를 들어, 여기에 내가 API를 통해 노출 저장 방법의 종류입니다. 자식 엔티티가 추가 또는 수정 된 동안 모든 것이 예상대로 작동합니다.

백 엔드가 AB이라는 ChildEntity 두 개가로드 된 ParentEntity을 수신했다고 가정 해 봅시다.

이제 백엔드에서 B 하위 엔티티를 제거하고 저장 메소드에 게시합니다. 모든 업데이트가 ParentEntityChildEntity A.

에 유지됩니다하지만 B ChildEntity가 무엇에 아무런 표시가 없었기 때문에 논리적 보인다 데이터 저장소에 남아 :

백엔드는 수신 데이터의 변경 사항을 저장 그것으로해라.

제 질문은입니다. 매우 일반적인 경우 인 것 같습니다. 어떻게 처리해야합니까?

나는 자식 컬렉션을 저장하고, 변경 사항을 저장하고, 루트 엔티티를 다시로드하고, 컬렉션을 비교하고, 제거해야 할 것인지를 결정한 다음이를 제거하는 것을 상상했습니다.하지만 꽤 어렵고 더러운 것 같습니다. 더 좋은 방법이 있습니까?

답변

1

질문에 대한 대답은 여기

https://msdn.microsoft.com/da-dk/magazine/mt694083

+0

상태 추적 메커니즘이 ADO.Net 데이터 세트에서 EF 코어, EF <= 4 (ObjectContext 및 EF> = 4.1 및 DbContext)를 통해 구현 된 방법에 대한 매우 흥미로운 게시물입니다. 따라서 필자가 이해하는 한, 연결이 끊긴 엔터티 내에서 자식 개체의 차등 삭제를 처리하는 특정 문제를 해결하는 방법을 설명하지 못합니다. – kall2sollies

0

은 몇 가지 팁에 따르면 위의 MSDN 블로그 게시물에 설명이 기본 클래스의를 통해, 나는 모든 개체에 클라이언트 상태 필드를 구현 한 :

public enum ObjectState 
{ 
    Unchanged = 0, 
    Added = 1, 
    Modified = 2, 
    Deleted = 3 
} 

public interface IObjectWithState 
{ 
    ObjectState ClientState { get; set; } 
} 

public abstract class BaseEntity : IBaseEntity, IPrimaryKey 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 

    [NotMapped] 
    public bool IsNew => Id <= 0; 
    [NotMapped] 
    public ObjectState ClientState { get; set; } = ObjectState.Unchanged; 
} 

하위 엔티티가 클라이언트 측 컬렉션에서 제거 될 때마다 물리적으로 제거되고 게시되지 않고 항상 컬렉션에 보관하고 삭제 된 것으로 표시합니다.

_context.ChildEntityCollection.RemoveRange(
    entity.ChildCollection.Where(c => c.ClientState == ObjectState.Deleted).ToList() 
); 
_context.SaveChanges(); 

내가 모든 개체에 대한 전체 열거를 구현하지만, 현재 나는 단지 삭제 된 값을 사용하고 만 관계를 통해 :

그럼 난 그냥 서버 측에서 그 처리해야합니다. 지금까지는 다른 값이나 루트 엔티티의 값이 필요하지 않습니다.

+0

더 나은 사람이 올 때까지 내 대답을 받아 들일 수 없습니다! – kall2sollies