2

2 つの異なる DbContext から同時にデータにアクセスする必要があり、それぞれがクエリに READ UNCOMMITTED を使用していることを確認します (実際、重要なことは、反復する行をロックしないことです。クエリに WITH NO LOCK を追加すると、仕事も)。

Entity Framework を使用してこれを行うにはどうすればよいですか? 2 つのクエリのそれぞれを TransactionScope でラップすると、トランザクションを MSDTC に昇格させようとしますが、これはオプションではありません。

private static IEnumerable<Image> EnumerateSourceImages()
{
    using (var dbContext = new SourceDbContext())
    {
        using (var transScope = new TransactionScope(
                                    TransactionScopeOption.RequiresNew,
                                    new TransactionOptions() {
                                            IsolationLevel = IsolationLevel.ReadUncommitted
                                        }
                                    )
                            )
        {
            var imagesSourceQuery = dbContext.ImageDatas
                                    .AsNoTracking()
                                    .OrderBy(imageData => imageData.ImageID)
            foreach (var image in imagesSourceQuery)
            {
                yield return image;
            }
            transScope.Complete();
        }
    }
}
private static IEnumerable<Image> EnumerateDestinationImages()
{
    using (var dbContext = new DestinationDbContext())
    {
        using (var transScope = new TransactionScope(
                                    TransactionScopeOption.RequiresNew,
                                    new TransactionOptions() {
                                            IsolationLevel = IsolationLevel.ReadUncommitted
                                        }
                                    )
                            )
        {
            var imagesSourceQuery = dbContext.ImageDatas
                                .AsNoTracking()
                                .OrderBy(imageData => imageData.ImageID)
            foreach (var image in imagesSourceQuery)
            {
                yield return image;
            }
            transScope.Complete();
        }
    }
}
private static void main(string[] args){
{
    IEnumerator<ItemImage> sourceImagesEnumerator = null;
    IEnumerator<ItemImage> destImagesEnumerator = null;
    try{
        sourceImagesEnumerator = EnumerateSourceImages().GetEnumerator();
        destImagesEnumerator = EnumerateDestinationImages().GetEnumerator();

        bool sourceHasMore = sourceImagesEnumerator.MoveNext();
        //Exception on next line about MSDTC Promotion
        bool destHasMore = destImagesEnumerator.MoveNext();
    } finally{
        if(sourceImagesEnumerator != null) sourceImagesEnumerator.Dispose();
        if(destImagesEnumerator != null) destImagesEnumerator.Dispose():
    }
}
4

1 に答える 1

0

接続文字列にenlist=falseを設定してみましたか?

http://forums.asp.net/t/1401606.aspx/1

Brgrds、Lari

于 2012-07-19T23:18:55.320 に答える