通过WCF验证自我跟踪实体(EF)

时间:2011-06-16 23:58:10

标签: wcf entity-framework self-tracking-entities contract operation

我在定义添加/更新实体时OperationContract应该是什么时遇到问题。我想通过WCF服务将实体(或实体列表)发送到ObjectContext(它将实例化业务管理器以供我进行实际验证)。

如果实体通过了所有验证规则(很可能需要查询数据库以确定更复杂的业务规则的通过/失败),它将被保存到数据库中,并且我会将其保存到数据库中。需要能够传回其ID(标识列主键)和并发令牌(timestamp列)的值,但如果失败,显然我们想要一条或多条消息说出错误。在更新的情况下,我们所需要的只是并发令牌的新值,但我们又想要验证消息。

为了使其更加棘手,实体也可以拥有多个子/孙实体。例如,Trip将有Stops,可能有订单。

我只是想知道人们如何在现实世界中处理这个问题。最简单的示例只显示WCF服务的操作,如:

[OperationContract]
bool AddEntity(Entity e);

[OperationContract]
bool UpdateEntity(Entity e);

有没有人对处理这个有什么好主意?我想我真的只是在寻找实用的建议。

我们是否应该尝试在一次服务电话中保存一组对象?

我们是否应该通过故障合同传达验证信息?

任何建议/意见都会有所帮助,谢谢!

1 个答案:

答案 0 :(得分:0)

  

我们应该试图保存一个   一个服务中的对象集合   调用

如果你的意思是在一个电话中保存整个对象图,那么答案肯定是肯定的。如果您的意思是在一个调用中保存多个独立对象图(集合),那么答案可能是肯定的。最好将客户端和服务之间的往返次数减少到最小,但同时这样做会带来复杂性。您必须确定整个集合是否必须保存为原子操作,或者您是否满意只保存部分集合并返回其余部分的错误。这将影响您的架构的其余部分。

  

我们是否应该传达验证   通过过错合同的消息?

是,但仅当您将保存操作用作原子时,因为错误合同是异常,异常应该破坏当前操作并仅返回验证错误。单个故障合同应该足以转移所有验证错误。不要为每个单独的验证错误触发异常,因为它会使您的应用程序非常烦人且无用。

如果您只想保存通过验证并返回错误的部分集合,则不应使用错误合同。您应该使用一些容器数据合同来代替故障合同,这些合同将包含已保存数据的ID和时间戳以及未保存数据的ID和错误。

对STEs的一点注意事项:传回ID和时间戳可能很棘手。我不确定您是否在设置它们时不必关闭跟踪,之后再次启用跟踪。