这显然是一个已经讨论过很多次的话题,但是我在这里的处理角度有点不同。据我了解,STE 被认为是 POCO(它不以任何方式与 EF dll 绑定),它只是在其中有一些额外的“东西”用于处理自己的更改跟踪。假设有以下应用层:
Proj.Web
Proj.Business
Proj.Model
Proj.DataAccess
假设lazy loading
不需要,并且我们在 2 层设置中运行,我的理解是使用 STE 和 POCO 之间确实没有区别。由于我们在网络上并且它是一个断开连接的环境,因此选择将是附加的 SQL 查询,Postback
或者必须附加实体并将属性设置为根据需要进行修改。再次(如果我错了,请纠正我)代码看起来相同。
让我们考虑一个简单的例子,我们正在处理 webform 应用程序中的回发:
Person p = PersonManager.GetById(2); //we use the "requery" method
PersonManager.Update(p);
//If we dig into PersonManager.Update() we'll see the following:
PersonRepository.ApplyChanges(p); //we're assuming STEs are used so this API is available
PersonRepository.SaveChanges();
假设稍后我们被要求将架构提升到 3 层,在 Proj.Bussiness 和 Proj.Web 之间引入 WCF 传输层,我们称之为 Proj.Services。如果我们一开始就使用 STE,我们不是处于一个更好的位置吗?我们所要做的就是将调用转发到业务层,而无需以任何方式修改它或存储库:
PersonService.Update(Person p)
{
PersonManager.Update(p);
}
例如,如果我们使用 POCO(假设快照),我们必须以一种必须检查该实体是否已经存在于上下文中的方式进行编码(如果我们正在运行 2 层),如果不存在(3 -tier) 附加它并将其属性设置为已修改。当您不确定将来是否需要 3 层解决方案时,似乎需要做更多的工作。另一方面,如果您一直都在针对 STE 进行编码,那么您唯一需要添加的额外不必要的(实际上并没有损害任何东西)代码就是调用 ApplyChanges()。否则,我认为您不会丢失任何东西(再次假设不需要延迟加载)。你对这个话题有什么看法?