1

내 원래 질문은 here입니다.EF 저장소가있는 누적 루트에서 자식 개체 삭제

아래는 나의 업데이트 코드입니다.

Public Function StockTransferItemRemove(removeRequest As StockTransferItemRequest) As StockTransferItemResponse Implements IStockTransferService.StockTransferItemRemove 
     ' create your objects 
     Dim removeResponse = New StockTransferItemResponse 
     Dim stockTransfer As New StockTransfer 
     Dim stockTransferItem As New StockTransferItem 

     Try 

      ' get the aggregate root 
      stockTransfer = _stockTransferRepository.FindBy(removeRequest.StockTransferID).FirstOrDefault 

      stockTransfer.RemoveItem(removeRequest.StockTransferItemView.Id) 

      _stockTransferRepository.Save(stockTransfer) 

      Dim count As Integer = _uow.WMSCommit() 

      If (count > 0) Then 
       ' the object was saved succesfully 
        removeResponse.Success = True 
      Else 
       ' the object was not saved successfully 
       removeResponse.BrokenRules.Add(New BusinessRule(String.Empty, String.Empty, Tags.Messages.Commit_Failed)) 
      End If 


     Catch ex As Exception 
      ' an unexpected error occured 
      removeResponse.BrokenRules.Add(New BusinessRule(String.Empty, String.Empty, ex.Message)) 
     End Try 

     Return removeResponse 
    End Function 

작업 단위 (UOW)가 커미트를 시도하면 다음 오류 메시지가 생성됩니다.

The operation failed: The relationship could not be changed because one or more of 
the foreign-key properties is non-nullable. When a change is made to a relationship, 
the related foreign-key property is set to a null value. If the foreign-key does not 
support null values, a new relationship must be defined, the foreign-key property must 
be assigned another non-null value, or the unrelated object must be deleted. 

내가 알고 내가 StockTransfer.RemoveItem()를 사용하여이 컬렉션에서 항목을 제거하는 것이하지만 내가 오류가 발생하고 왜 데이터베이스에 기록을 유지합니다.

루트 루트에서 하위 개체를 제거하고 집계 루트를 유지하는 방법이 있습니까?

답변

0

불명확 한 코드에 대해 유감이지만 VB 코드에서 내 길을 찾으려고 노력하는 C# 사용자입니다. 지우려는 엔티티 링크에 .Clear() 옵션을 사용해야합니다.

예 :

회사 <> 종업원

Company.Emplyees.Clear는()의 관계 테이블의 모든 레코드를 제거합니다.

+0

관계 테이블의 모든 레코드를 제거하고 싶지는 않습니다. 특정 항목 만 삭제하려고합니다. – user1180223

0

문제가 있습니다. 나는 순수한 해결책을 모른다.하지만 나는 변화를 저장하기 전에 항상 ef 문맥에서 그것을 삭제해야만한다. 저장을위한 저장소 방법에서 ef 컨텍스트에는 있지만 집계 컬렉션에는없는 엔티티가 있는지 확인하고 컨텍스트에서 dbset에서 제거해야합니다.

+0

저장 방법에 대한 간단한 예를 제공해 주시겠습니까? 지금은 내 집계 방법 인 내 집계 루트 인 엔티티 만 전달합니다. 나는 다른 것을 통과해야합니까? – user1180223

0

좋은 해결책을 찾았습니까? ParentAttribute를 사용하고 DbContext SaveChanges 또는 ValidateEntity를 확장하여 솔루션을 만들었습니다. 내 솔루션 here을 찾을 수 있습니다.

0

대답은 조금 늦을 수 있지만 DataContext (DbContext에서 상속)이라는 내 데이터 컨텍스트의이 확장 메서드는 EF4.3을 사용하여 저에게 효과적이었습니다.

public static void Delete<TEntity>(this DataContext context, IEnumerable<TEntity> entities) where TEntity : class, new() 
{ 
    foreach (var entity in entities) 
    { 
     context.Delete(entity); 
    } 
} 

public static void Delete<TEntity>(this DataContext context, TEntity entity) where TEntity : class, new() 
{ 
    var obj = context.Entry(entity); 
    if (obj.State == System.Data.EntityState.Detached) 
    { 
     context.Set(typeof(TEntity)).Attach(obj.Entity); 
    } 
    context.Set(typeof(TEntity)).Remove(obj.Entity); 
} 

그리고 완전성을위한 데이터 컨텍스트 클래스.

public class DataContext : DbContext 
{ 
    public DbSet<MyPOCO> POCOs { get; set; } 

    ... 
}