实体框架上下文在修改时不会刷新

时间:2015-11-03 10:39:57

标签: c# wpf multithreading entity-framework entity

我有一个WPF项目n-tier架构和我使用上下文/调用,因为它有Direct-databaseweb-service

抱歉有点长问题

  

Presentation =>业务层=>数据层

datalayer我实施了UnitOfWork模式。

  

最初,当我的DefaultAccessPointStatic属性时,我在multiple thread上遇到了使用相同上下文的问题。

     

我已通过将DefaultAccessPoint更改为non-static属性来解决此问题,并且似乎多线程问题已得到解决。

     

在fix =>之后(例如)用户可以将数据插入到第一个选项卡上的应用程序(大约需要3分钟)并同时访问第二个选项卡(获取一些数据),同时两个都在不同的线程中完成。

但在此修复后,修改完成后Context不会刷新

初始修复是在DataProviderBase类下完成的,我将static DataAccessPoint更改为Non-static,并对您在下面看到的那些行进行了评论。

如何使用多线程保持上下文刷新?

感谢任何帮助

代码阻止

这是我的dataproviderbase课程,每个数据提供者都会继承此基础

public abstract class DataProviderBase
{
    public DataProviderBase()
    {
        DefaultAccessPoint = new DataAccessAccessPoint(ConnectionString);
    }

    protected readonly ILogger logger = LoggerFactory.GetLogger();
    private static string _connectionString;
    public static string ConnectionString
    {
        get
        {
            return _connectionString;
        }
        set
        {
            _connectionString = value;
            //COMMENTED as Fix for multiThreading
            //_defaultAccessPoint = new DataAccessAccessPoint(ConnectionString);
        }
    }

    private IDataAccessAccessPoint _defaultAccessPoint;
    public IDataAccessAccessPoint DefaultAccessPoint
    {
        get
        {
             //COMMENTED as Fix for multi Threading
            // Removed statis Default AccessPoint that was causing the issue
            return _defaultAccessPoint; //?? (_defaultAccessPoint = new DataAccessAccessPoint(ConnectionString));
        }
        set { _defaultAccessPoint = value; }
    }


}

这是我的DataAccessPoint

public class DataAccessAccessPoint : IDataAccessAccessPoint
{
    private string _connectionString;

    public string ConnectionString
    {
        get
        {
            return _connectionString;
        }
        set
        {
            _connectionString = value;
        }
    }

    private IDataContext context;

    public DataAccessAccessPoint(string connectionString)
    {
        _connectionString = connectionString;
        context = new MyDataContext(_connectionString);
    }

    public virtual bool Save()
    {
        return context.SaveChanges() > 0;
    }

    private bool disposed = false;

    protected virtual void Dispose(bool disposing)
    {
        if (!this.disposed)
        {
            if (disposing)
            {
                context.Dispose();
            }
        }
        this.disposed = true;
    }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    //Here i supply the context to my Data access layers
    private IMyDataLayerDA _myDA;
    public IMyDataLayerdDA MydDA
    {
        get { return _myDA ?? (_myDA = new MydDA(context)); }
        set { _myDA = value; }
    }

}

我的DataProvider

 public class PersonRoleDataProvider : DataProviderBase, IPersonRoleDataProvider
{
    public MYDTOCLASS AuthenticateUser(string userId)
    {
        return DefaultAccessPoint.MydDA.AuthenticateUser(userId);
    }

    public IEnumerable<MYDTOCLASS> GetRoles(int personId)
    {
        return DefaultAccessPoint.MydDA.GetRoles(personId);
    } 
}

DataProviderAccessPoint

  public class DataProviderAccessPoint
  {

    private static PersonRoleDataProvider _personRoleDataProvider;
    public static PersonRoleDataProvider  PersonRoleDataProvider 
    {
        get
        {
             if(_personRoleDataProvider==null)
             _personRoleDataProvider = new PersonRoleDataProvider();

            return _personRoleDataProvider;
        }
    }

 }

0 个答案:

没有答案