0

我在前端使用 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");

但我看不到那些对象/实体/???已定义(我说的是CustomerProduct

我已经使用使用Add Service Reference创建的实体对其进行了测试,但这似乎不起作用。返回的实体仍然具有状态Unchanged

我宁愿不在我的前端引用 EF 实体,因为我想让它们分开并且在我的前端只有序列化的对象。不过,如果真的有必要,我可能只需要这样做。

哦,MarkAsModified()虽然在实体对象上使用该方法确实工作得很好,但这更像是一种黑客行为,因为实体应该自己检查他的状态。

关于如何进行的任何建议?我的猜测是MarkAsModiefied()在我的 Web 应用程序中使用该方法或引用实体模型项目可能是可行的解决方法,但如果有更好的方法,我想先尝试一下。

4

1 回答 1

0

您需要将自跟踪实体移出实体框架项目

如果您查看 .tt 文件,您会看到有一个您需要填写的 .edmx 文件的路径。

这将允许您将它们放在与实体框架分开的项目中。

然后,您可以从前端引用此项目,并按您的预期访问跟踪实体。

至于执行更新......好吧,我正在寻找自己;p(我真的不想自己将它们筛选到不同的状态)

你说这个'确保在你的客户端上重用自我跟踪实体模板生成的实体代码'

然后你说你不想在低处做这件事。

那是你的问题。

于 2011-01-18T15:38:01.887 回答