我这段代码有什么问题?如何保证context上下文唯一?
public class RepositoryBase<T> : IRepository<T> where T:class,new() { private BaseContext _context; private BaseContext Context { get { if (_context != null) { return _context; } else { _context = new BaseContext(); return _context; } } set { _context = value; } } public void Delete(Expression<Func<T,bool>> exp) { var datas= Context.Set<T>().Where(exp); Context.Set<T>().RemoveRange(datas); Context.SaveChanges(); } public T Get(Expression<Func<T, bool>> exp) { return Context.Set<T>().Where(exp).FirstOrDefault(); } public IEnumerable<T> Gets(Expression<Func<T, bool>> exp) { return Context.Set<T>().Where(exp); } public void Insert(T entity) { Context.Set<T>().Add(entity); Context.SaveChanges(); } public void Save() { Context.SaveChanges(); } public void Update(T student) { // context.Set<T>().FirstOrDefault() } }
要想上下文唯一,就需要使用单例模式
大神,,,你看清楚点我的问题啊
@陌陌秋雨: 如果你在一个地方使用多个实体的仓储,那么你就不会遇到上下文不唯一的问题,
你把上下文设计成单例模式,就不会出现上下文不唯一的问题了
@刘宏玺: 那我把上下文创建里面新增一个Create方法是不是就单利了?
private static BaseContext _context; private static BaseContext Context { get { if (_context != null) { return _context; } else { _context = new BaseContext(); return _context; } } set { _context = value; } } public static DbContext Create() { return Context; }
@陌陌秋雨: 这么写是对的!但是你现在还需要做一个工作,就是吧BaseContext的构造函数设置成private,然后就是完美的单线程的单例了
@刘宏玺: 谢谢大神。明白了