我在前端使用MVP(模型视图展示器)设置了一个小的n层Web应用程序,在后端使用WCF服务,它与BLL进行通信,后面是DAL,它与EF4.0。 这一切都很好,我已经创建了几个Get和Add方法都可以。 现在我想创建几个Update方法。由于我正在使用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");
但是我没看到那些对象/实体/ ???是定义的(我说的是客户和产品)
我使用添加服务参考创建的实体对其进行了测试,但这似乎不起作用。返回的实体的状态仍为 Unchanged 。
我宁愿不在我的前端引用EF实体,因为我想让它们分开并且只在我的前端有序列化的对象。但是,如果真的有必要,我可能只需这样做。
哦,在实体对象上使用MarkAsModified()
方法确实可以很好地工作,但这更像是一个黑客,因为实体应该自己检查他的状态。
有关如何进行的任何建议?
我的猜测是使用MarkAsModiefied()
方法或在我的网络应用程序中引用实体模型项目可能是可行的解决方案,但如果有更好的东西,我想首先尝试。
答案 0 :(得分:0)
您需要将自我跟踪实体移出实体frameowrk项目
如果你查看.tt文件,你会看到你要填写的.edmx文件的路径。
这将使您将它们分离到与实体框架分离的项目中。
然后,您可以从前端引用此项目,并可以按预期访问跟踪实体。
至于执行更新......我正在寻找自己; p (我真的不想把它们自己筛选到不同的状态)
你说这个 '确保在客户端上重复使用自我跟踪实体模板生成的实体代码然后你说你不想这样做。
这是你的问题。