1

我原来的问题在这里

下面是我更新的代码。

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

4 回答 4

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; }

    ...
}
于 2012-06-27T13:38:53.430 回答
0

那也是我遇到的问题。我不知道纯粹的解决方案,但我总是必须在保存更改之前手动在 ef 上下文中删除它。在您的存储库方法中保存您应该检查在 ef 上下文中但不在聚合集合中的实体,并将它们从上下文的 dbset 中删除。

于 2012-02-05T13:03:12.357 回答
0

你找到好的解决方案了吗?我创建了一个使用 ParentAttribute 并扩展 DbContext SaveChanges 或 ValidateEntity 的解决方案。你可以在这里找到我的解决方案。

于 2012-05-15T12:37:03.850 回答
0

对于不清楚的代码,我很抱歉,但我是一个 C# 人,所以试图在 VB 代码中找到我的方式。您应该在要清除的实体链接上使用 .Clear() 选项。

例子:

公司 <> 员工

Company.Emplyees.Clear() 删除关系表中的所有记录。

于 2012-02-03T15:26:59.353 回答