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
无论如何可能是一个单例。@GertArnoldDefaultAccessPoint
在DataProviderBase
的构造函数中初始化,PersonRoleDataProvider
是从base派生的