这是场景:
基本上,所有很酷的东西.:)
基本UI操作的事件流程("添加帖子"):
现在,我正在尝试找出可以进行验证的地方.
在这个阶段,我需要两种类型的验证:
现在,我一直在阅读Julie Lerman 撰写的 "编程实体框架,第二版"(这是一个优秀的BTW),并且一直在寻找挂钩SavingChanges事件以执行"最后一分钟"验证.这将是一个很好的方法,以确保每当我做"某事"(添加,修改,删除)时总是会发生验证,但它也有点晚了IMO(因为项目已经在状态管理器中) - 所以我能做什么如果验证失败,删除它们?
我当然可以让我的POCO实现一个接口(比如"IValidatable"),并在此事件期间调用此接口上的方法.
但对于业务验证来说,这似乎"为时已晚" - 这是共识吗?
我基本上都在寻找指导,我正在尝试为复杂的业务逻辑设计一个可重用的智能验证方案,考虑到我的上述架构.
另一个曲线球 - 如你所知,POCO与EF意味着POCO拥有数据库中的所有属性 - 所以我可能有一个"PostID"属性,带有get/set访问器(因为EF需要获取/设置这些属性) ).
但问题是,"PostID"是一个标识列,那么我如何保护该字段不被明确设置?例如,如果我(由于某种原因)执行以下操作:
var post = service.FindSingle(10);
post.PostId = 10;
unitOfWork.Commit();
Run Code Online (Sandbox Code Playgroud)
这将抛出一个SqlException.我该如何防止这种情况?我无法"隐藏"该属性(使其成为私有属性,甚至是内部属性),因为POCO是与存储库分开组装的.
关于验证的说明 - 我计划创建自定义异常(从Exception派生).因此,当验证失败时,我需要抛出这些异常.
这样,我可以在我的控制器上编码这样的代码:
[HttpPost]
public ActionResult AddPost(Post post)
{
try
{
IUnitOfWork uow = new UnitOfWork();
postService.Add(post);
uow.Commit(); …Run Code Online (Sandbox Code Playgroud) validation asp.net-mvc design-patterns poco entity-framework-4