0

次のような多くのテストがあります。

using (new TransactionScope())
{
    var repository = _unitOfWork.DataFieldSetRepository;

    var entity = new DataFieldSet {Label = "test", Title = "test"};

    repository.Add(entity);
    _unitOfWork.Commit();

    entity = repository.GetAll().Single(x => x.Id == entity.Id);

    entity.IsClosed = true;
    repository.Update(entity);
    _unitOfWork.Commit();

    repository.Delete(entity);
    _unitOfWork.Commit();
}

例外がスローされない限りテストに合格するため、Assert はありません。

このコードをコピーしていくつかの詳細を変更する代わりに、一般化したいと思います。異なる唯一のビットは次のとおりです。

1) エンティティ タイプと対応するリポジトリ (ここでは DataFieldSet と DataFieldSetRepository) 2) 新しく作成されたエンティティのコンテンツ (通常は、テストに合格するための最小限のコンテンツ。ここでは、Label と Title を null にすることはできません) 3) 更新操作 (通常は、値が変更されたランダムなプロパティは 1 つだけです)

これまでのところ、私はこれを持っています:

public void AssertCrudOperationsWork<T>(T entity, Func<T, T, bool> keyComparer, Action<T> updateAction) where T : class
{
    using (new TransactionScope())
    {
        var repository = (IRepository<T>)_unitOfWork.GetType().GetProperty(typeof(T).Name + "Repository").GetValue(_unitOfWork);

        repository.Add(entity);
        _unitOfWork.Commit();

        //var keyProperties = typeof(T).GetProperties().Where(prop => prop.IsDefined(typeof(KeyAttribute), false));

        Expression<Func<T, bool>> keyEqualsKey = x => keyComparer(x, entity);
        entity = repository.GetAll().Single(keyEqualsKey);

        updateAction(entity);
        repository.Update(entity);
        _unitOfWork.Commit();

        repository.Delete(entity);
        _unitOfWork.Commit();
    }            
}

[TestMethod]
public void CRUDTest_DataFieldGroup()
{
    AssertCrudOperationsWork(new DataFieldSet {Label = "test", Title = "test"}, (a, b) => a.Id == b.Id, x => x.IsClosed = true);
}

問題は、次の呼び出しで失敗することSingle()です。The LINQ expression node type 'Invoke' is not supported in LINQ to Entities.

私のkeyEqualsKey述語は元の とまったく同じではないと思いx => x.Id == entity.Idます。

これを修正する方法はありますか?

コメント行//var keyProperties ...は、エンティティのすべての主要なプロパティを取得します。とを完全に削除できるようにkeyComparer、エンティティ キーを比較して述語を動的に作成する方法はありますか?keyEqualsKey

4

0 に答える 0