C# 修改时未刷新实体框架上下文

C# 修改时未刷新实体框架上下文,c#,wpf,multithreading,entity-framework,entity,C#,Wpf,Multithreading,Entity Framework,Entity,我有一个WPF项目,它是n层体系结构,我使用上下文/调用,因为它有直接数据库和web服务 对不起,我的问题有点长 表示=>业务层=>数据层 在datalayer中,我实现了UnitOfWork模式 最初,当我的DefaultAccessPoint是一个Static属性时,我在使用相同上下文的多线程上遇到问题 我已经通过将DefaultAccessPoint更改为非静态属性解决了这个问题,似乎多线程问题已经解决了 修复=>(例如)后,用户可以在第一个选项卡上向应用程序插入数据(大约需要3分钟),同

我有一个
WPF
项目,它是
n层
体系结构,我使用上下文/调用,因为它有
直接数据库
web服务

对不起,我的问题有点长

表示=>业务层=>数据层

datalayer
中,我实现了
UnitOfWork
模式

最初,当我的
DefaultAccessPoint
是一个
Static
属性时,我在使用相同上下文的
多线程上遇到问题

我已经通过将
DefaultAccessPoint
更改为
非静态属性解决了这个问题,似乎多线程问题已经解决了

修复=>(例如)后,用户可以在第一个选项卡上向应用程序插入数据(大约需要3分钟),同时访问第二个选项卡(以获取一些数据),而这两个选项卡都在单独的线程中完成

但在此修复之后,
上下文在修改完成时不会刷新

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; }
    }


}
初始修复是在
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; }
    }
   
}
我的
数据提供程序

 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);
    } 
}

那么现在在哪里/如何实例化
DefaultAccessPoint
?请注意,
PersonRoleDataProvider
无论如何可能是一个单例。@GertArnold
DefaultAccessPoint
DataProviderBase
的构造函数中初始化,
PersonRoleDataProvider
是从base派生的