我在前端使用 MVP(Model View Presenter)设置了一个小的 n 层 Web 应用程序,后端是一个 WCF 服务,它与 BLL 通信,在 DAL 的后面,它与 EF4.0 通信. 这一切都很好,我创建了几个都可以工作的 Get 和 Add 方法。现在我想创建几个更新方法。由于我使用的是 EF4.0 的自我跟踪实体 (STE),所以我认为一切都会很好,实施也会相当容易。
情况似乎并非如此。在 Web 前端更改我的项目时,它们在移回 WCF 服务时保持状态不变。因为实体没有改变,所以数据库中没有任何更新。通过关于 SO 的这个问题:EF 4 Self Tracking Entities does not work as expected 我看到这篇文章更详细地讲述了有关在 n 层应用程序中实现 STE 的内容。(http://msdn.microsoft.com/en-us/magazine/ee335715.aspx)我引用:
确保在您的客户端上重用自我跟踪实体模板生成的实体代码。 如果您使用由 Visual Studio 或其他工具中的添加服务引用生成的代理代码,大部分情况看起来都是正确的,但您会发现实体实际上并没有跟踪它们在客户端上的更改。
好吧,我已经设法使用以下代码为服务创建了一个客户端:
var svc = new ChannelFactory<INorthwindSTEService>(
"INorthwindSTEService")
.CreateChannel();
这似乎工作得很好。问题是,我如何在客户端获取序列化实体?在代码示例中,我看到作者使用以下代码:
var products = new List<Product>(svc.GetProducts());
var customer = svc.GetCustomer("ALFKI");
但我看不到那些对象/实体/???已定义(我说的是Customer和Product)
我已经使用使用Add Service Reference创建的实体对其进行了测试,但这似乎不起作用。返回的实体仍然具有状态Unchanged。
我宁愿不在我的前端引用 EF 实体,因为我想让它们分开并且在我的前端只有序列化的对象。不过,如果真的有必要,我可能只需要这样做。
哦,MarkAsModified()
虽然在实体对象上使用该方法确实工作得很好,但这更像是一种黑客行为,因为实体应该自己检查他的状态。
关于如何进行的任何建议?我的猜测是MarkAsModiefied()
在我的 Web 应用程序中使用该方法或引用实体模型项目可能是可行的解决方法,但如果有更好的方法,我想先尝试一下。