Удалить дочерний объект из совокупного корня с помощью репозитория EF - PullRequest
1 голос
/ 03 февраля 2012

Мой оригинальный вопрос здесь .

Ниже приведен мой обновленный код.

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

Когда единица работы пытается выполнить фиксацию, она выдает следующее сообщение об ошибке.

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 (), он удаляет элемент из коллекции, но сохраняет запись в базе данных, поэтому я получаю сообщение об ошибке.

Есть ли способ удаления дочернего объекта из совокупного корня и сохранения совокупного корня?

Ответы [ 4 ]

0 голосов
/ 27 июня 2012

Ответ может быть немного запоздалым, но этот метод расширения в моем контексте данных, называемый 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; }

    ...
}
0 голосов
/ 05 февраля 2012

Это тоже проблема, с которой я столкнулся.Я не знаю чистого решения, но мне всегда приходится удалять его вручную в контексте ef перед сохранением изменений.В вашем методе репозитория для сохранения Вы должны проверить сущности, которые находятся в контексте ef, но не в коллекции агрегатов, и удалить их из базы данных в контексте.

0 голосов
/ 15 мая 2012

Нашли хорошее решение?Я создал решение с использованием ParentAttribute и расширения DbContext SaveChanges или ValidateEntity.Вы можете найти мое решение здесь .

0 голосов
/ 03 февраля 2012

Прошу прощения за неясный код, но я парень на C #, поэтому пытаюсь найти свой путь в VB Code. Вы должны использовать опцию .Clear () для ссылки на сущности, которую вы хотите очистить.

Пример:

Компания <> Сотрудники

Company.Emplyees.Clear () удаляет все записи в отношении таблица.

...