我试图设置一个使用UnitOfWork和Repository模式的项目。为什么我的DataContext没有看到对对象(Unit Of Work)的更改?
现在我不能使用一个IoC和EF4,所以我想用Linq和DataContext的一点依赖性:(。我不会隐瞒我对所有的集成有点困惑这些概念我注意到调试我的代码,DataContext没有看到对某个对象所做的更新,但是每次都向数据库添加一个新的实体。我的问题,也许这是一个简单的步骤。在我继续之前,这里是我的:
例如,我有一个对象叫foo ...我有foo控制器,在构造函数中创建fooRepository的一个新实例。 fooRepository我添加了一个对我的UnitOfWork的引用包装DataContext ...是吗? 这里是我的代码
public class ListaController : Controller
{
IListaRepository _listaRepository;
public ListaController()
: this(new ListaRepository()) {
}
public ListaController(IListaRepository repository)
{
_listaRepository = repository;
}
[HttpPost]
public ActionResult Edit(int id, Lista lista)
{
try
{
this._listaRepository.Save(lista);
return RedirectToAction("Index");
}
catch
{
return View();
}
}
}
public class ListaRepository : LinqRepository<Lista>, IListaRepository
{
protected IUnitOfWork uow
{
get { return base.GetCurrentUnitOfWork<IUnitOfWork>(); }
}
public ListaRepository()
: base()
{
}
public override void Add(Lista lista)
{
this.uow.Context.Listas.InsertOnSubmit(lista);
this.uow.Commit();
}
public override void Save(Lista lista)
{
Add(lista);
}
}
public static class UnitOfWork
{
private const string HTTPCONTEXTKEY = "Domain.HttpContext.Key";
private static IUnitOfWorkFactory _unitOfWorkFactory;
private static readonly Hashtable _threads = new Hashtable();
public static void Commit()
{
IUnitOfWork unitOfWork = GetUnitOfWork();
if (unitOfWork != null)
{
unitOfWork.Commit();
}
}
public static IUnitOfWork Current
{
get
{
IUnitOfWork unitOfWork = GetUnitOfWork();
if (unitOfWork == null)
{
//Qui inserisco dipendenza in quanto non uso un IoC
//_unitOfWorkFactory = ObjectFactory.GetInstance<IUnitOfWorkFactory>();
_unitOfWorkFactory = new LinqUnitOfWorkFactory();
unitOfWork = _unitOfWorkFactory.Create();
SaveUnitOfWork(unitOfWork);
}
return unitOfWork;
}
}
private static IUnitOfWork GetUnitOfWork()
{
if (HttpContext.Current != null)
{
if (HttpContext.Current.Items.Contains(HTTPCONTEXTKEY))
{
return (IUnitOfWork)HttpContext.Current.Items[HTTPCONTEXTKEY];
}
return null;
}
else
{
Thread thread = Thread.CurrentThread;
if (string.IsNullOrEmpty(thread.Name))
{
thread.Name = Guid.NewGuid().ToString();
return null;
}
else
{
lock (_threads.SyncRoot)
{
return (IUnitOfWork)_threads[Thread.CurrentThread.Name];
}
}
}
}
private static void SaveUnitOfWork(IUnitOfWork unitOfWork)
{
if (HttpContext.Current != null)
{
HttpContext.Current.Items[HTTPCONTEXTKEY] = unitOfWork;
}
else
{
lock (_threads.SyncRoot)
{
_threads[Thread.CurrentThread.Name] = unitOfWork;
}
}
}
}
public abstract class LinqRepository<T> : IRepository<T> where T : class
{
protected ManagerEmailDataContext _context = new ManagerEmailDataContext();
protected ManagerEmailDataContext Context
{
get
{
if (_context == null)
{
_context = GetCurrentUnitOfWork<LinqUnitOfWork>().Context;
}
return _context;
}
}
public TUnitOfWork GetCurrentUnitOfWork<TUnitOfWork>() where TUnitOfWork : IUnitOfWork
{
return (TUnitOfWork)UnitOfWork.Current;
}
public abstract IQueryable<T> GetAll();
public abstract void Add(T entity);
public abstract void Save(T entity);
public abstract T Get(int id);
}
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
LinqUnitOfWorkFactory.SetDataContext(() => new ManagerEmailDataContext());
}
public class LinqUnitOfWorkFactory : ManagerEmail.Models.IUnitOfWorkFactory
{
private static Func<ManagerEmailDataContext> _objectContextDelegate;
private static readonly Object _lockObject = new object();
public static void SetDataContext(Func<ManagerEmailDataContext> objectDataContextDelegate)
{
_objectContextDelegate = objectDataContextDelegate;
}
public IUnitOfWork Create()
{
ManagerEmailDataContext context;
lock (_lockObject)
{
context = _objectContextDelegate();
}
return new LinqUnitOfWork(context);
}
}`enter code here`
任何帮助或建议将不胜感激!
对不起,如果我发布了所有的代码,但这是一个令我疯狂的事情。
是的,我的mystake。我没有在我的UnitOfWork(我称之为SubmitChanges())中发布Commit方法,但问题与不同的数据上下文有关。我用上面的代码解决了。谢谢! – stuzzo 2011-01-28 09:20:15