2

我需要同时从两个不同的 DbContext 访问数据,确保每个都使用 READ UNCOMMITTED 进行查询(实际上,重要的是它不会锁定它迭代的行 - 将 WITH NO LOCK 添加到查询中也工作)。

你如何使用实体框架来做到这一点?如果我将两个查询中的每一个都包装在 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,拉里

于 2012-07-19T23:18:55.320 回答