【发布时间】:2010-09-13 14:35:18
【问题描述】:
我有一个使用 LINQ to SQL 进行数据访问的 ASP MVC 应用程序。 我正在尝试使用存储库和工作单元模式,服务层使用存储库和工作单元。 我在尝试对特定存储库执行更新时遇到问题。
我的应用架构如下:
我的服务等级:
public class MyService
{
private IRepositoryA _RepositoryA;
private IRepositoryB _RepositoryB;
private IUnitOfWork _unitOfWork;
public MyService(IRepositoryA ARepositoryA, IRepositoryB ARepositoryB, IUnitOfWork AUnitOfWork)
{
_unitOfWork = AUnitOfWork;
_RepositoryA = ARepositoryA;
_RepositoryB = ARepositoryB;
}
public PerformActionOnObject(Guid AID)
{
MyObject obj = _RepositoryA.GetRecords()
.WithID(AID);
obj.SomeProperty = "Changed to new value";
_RepositoryA.UpdateRecord(obj);
_unitOfWork.Save();
}
}
存储库接口:
public interface IRepositoryA
{
IQueryable<MyObject> GetRecords();
UpdateRecord(MyObject obj);
}
存储库 LINQtoSQL 实现:
public class LINQtoSQLRepositoryA : IRepositoryA
{
private MyDataContext _DBContext;
public LINQtoSQLRepositoryA(IUnitOfWork AUnitOfWork)
{
_DBConext = AUnitOfWork as MyDataContext;
}
public IQueryable<MyObject> GetRecords()
{
return from records in _DBContext.MyTable
select new MyObject
{
ID = records.ID,
SomeProperty = records.SomeProperty
}
}
public bool UpdateRecord(MyObject AObj)
{
MyTableRecord record = (from u in _DB.MyTable
where u.ID == AObj.ID
select u).SingleOrDefault();
if (record == null)
{
return false;
}
record.SomeProperty = AObj.SomePropery;
return true;
}
}
工作单元界面:
public interface IUnitOfWork
{
void Save();
}
在数据上下文扩展中实现的工作单元。
public partial class MyDataContext : DataContext, IUnitOfWork
{
public void Save()
{
SubmitChanges();
}
}
StructureMap 注册表:
public class DataServiceRegistry : Registry
{
public DataServiceRegistry()
{
// Unit of work
For<IUnitOfWork>()
.HttpContextScoped()
.TheDefault.Is.ConstructedBy(() => new MyDataContext());
// RepositoryA
For<IRepositoryA>()
.Singleton()
.Use<LINQtoSQLRepositoryA>();
// RepositoryB
For<IRepositoryB>()
.Singleton()
.Use<LINQtoSQLRepositoryB>();
}
}
我的问题是,当我在我的服务对象上调用 PerformActionOnObject 时,更新永远不会触发任何 SQL。我认为这是因为 UnitofWork 对象中的数据上下文与 RepositoryA 中数据发生更改的数据上下文不同。因此,当服务在其 IUnitOfWork 上调用 Save() 时,底层数据上下文没有任何更新的数据,因此不会触发更新 SQL。
我在 StrutureMap 注册表设置中做错了什么吗?还是设计存在更根本的问题?
非常感谢。
【问题讨论】:
标签: linq-to-sql model-view-controller structuremap repository-pattern