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

それも私が抱えている問題です。純粋な解決策はわかりませんが、変更を保存する前に、efコンテキストで手動で削除する必要があります。保存用のリポジトリメソッドでefコンテキストにあるが、aggregatesコレクションにはないエンティティを確認し、コンテキストのdbsetから削除する必要があります。

于 2012-02-05T13:03:12.357 に答える
0

良い解決策は見つかりましたか?ParentAttribute を使用し、DbContext SaveChanges または ValidateEntity を拡張するソリューションを作成しました。ここで私の解決策を見つけることができます。

于 2012-05-15T12:37:03.850 に答える
0

不明瞭なコードで申し訳ありませんが、私はC#の人なので、VBコードで自分の道を見つけようとしています. クリアするエンティティ リンクで .Clear() オプションを使用する必要があります。

例:

会社 <> 従業員

Company.Emplyes.Clear() は、関係テーブル内のすべてのレコードを削除します。

于 2012-02-03T15:26:59.353 に答える
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 に答える