线程安全工作单元与EntityFramework

时间:2013-09-17 00:12:43

标签: c# entity-framework asynchronous unit-of-work

我有一个使用一个工作单元的数据层,它基本上是EnityFramework数据上下文的包装。

随着所有异步等待的东西四处流动,我以为我会开始尝试将这个数据层与一些异步调用一起使用。 (我一般都是异步编程的新手)

我很快就遇到了“已经有一个与此命令关联的开放数据阅读器”错误的问题。

有没有一种方法可以使我的工作单元线程安全?或者,当我即将打电话时,我应该创建另一个实例(换句话说,更加小心)。

有没有好的资源可以检查这样做?

我的一些谷歌搜索量并不多,所以我想我会把这个问题带到SO。

My Uow看起来像这样。

public class MyUnitOfWork: IMyUnitOfWork, IDisposable
{
    private MyDbContext DbContext { get; set; }
    protected IRepositoryProvider RepositoryProvider;

    public MyUnitOfWork(IRepositoryProvider repositoryProvider)
    {
        CreateDbContext();


        repositoryProvider.DbContext = DbContext;
        RepositoryProvider = repositoryProvider;
    }

    public MyUnitOfWork(IRepositoryProvider repositoryProvider, MyDbContext context)
    {
        DbContext = context;

        repositoryProvider.DbContext = DbContext;
        RepositoryProvider = repositoryProvider;

    }
    public void CreateDbContext()
    {
        DbContext = new MyDbContext();

        //Serialization false if we enable proxied entities
        DbContext.Configuration.ProxyCreationEnabled = false;

        //avoid serilaization trouble
        DbContext.Configuration.LazyLoadingEnabled = false;
    }
    public void Commit()
    {
        DbContext.SaveChanges();
    }

    public IRepository<Person> Persons {get { return repositoryProvider.GetRepo<Person>(); } }

    public IRepository<SomeOtherEntityType> SomeOtherType {get { return repositoryProvider.GetRepo<SomeOtherEntityType>(); } }

    // IDisposable 
    // ...
}

1 个答案:

答案 0 :(得分:-1)

本文提供了有关如何使用DbContext,生命周期,多线程等的一般指导原则。

http://msdn.microsoft.com/en-us/data/jj729737.aspx