实体框架中的验证、存储库类和代码结构

本文关键字:代码 结构 存储 框架 验证 实体 | 更新日期: 2023-09-27 18:10:46

我已经问了一个类似的问题,但我甚至不能看我写的代码,它看起来很可怕。有问题。

我试图创建一个简单的web应用程序与Visual Studio, ASP。Net网页和实体框架。人们对Web页面并不熟悉,它基本上就是一个像经典ASP和PHP一样的开发环境。

我有两张表,一张是工人表,另一张是加班表。我为两者都创建了模型,它们是相关的,所以每个加班记录都有一个工人。

基本上我用的是这个代码:

if (IsPost)
{
    try
    {
        Worker curWorker = new Worker();
        try
        {
            curWorker = m.Workers.Find(decimal.Parse(Request.Form["WorkerId"]));
        }
        catch (Exception)
        {
            errors += "Please select a worker.";
        }
        try
        {
            overhour.OverhourAmount = decimal.Parse(Request.Form["OverhourAmount"]);
            if (overhour.OverhourAmount == 0)
            {
                throw new Exception();
            }
        }
        catch (Exception)
        {
            errors += "Hour field should be numerical and non-zero.";
        }
        overhour.Worker = curWorker;
        overhour.OverhourDate = DateTime.Today;
        curWorker.Overhours.Add(overhour);
        if (errors != "")
        {
            throw new WrongValueException(errors);
        }
        m.SaveChanges();
        Response.Redirect(Page.ParentPage);
    }
    catch (DbEntityValidationException ex)
    {
        errors = kStatic.getValidationErrors(ex.EntityValidationErrors, "<br />");
    }
    catch (WrongValueException ex)
    {
        errors = ex.Message.ToString();
    }
    catch (Exception ex)
    {
        errors = "Critical error, technical details: " + ex.Message;
    }
}

表单有一个包含所有工人的组合框,命名为WorkerId。它工作,但我有几个问题。

    我讨厌验证方法。我需要验证用户是否从组合框中选择了一个有效的工作者,因为它有一个名为"选择工作者"的选项,它的值是空字符串,所以我需要检查它是否为数字。我可以包括一个[正则表达式…代码到我的模型类,但这并不重要,因为会有一个错误,当我试图分配字符串到十进制字段(十进制WorkerId)。我可以捕获异常,但它很可能是一个不匹配异常。我需要更多细节。
  1. 与OverhourAmount相同,它也应该是数字且非零。
  2. 我不喜欢把这些代码放到页面代码本身。我可以用像r这样的方法创建一个存储库类。adoverhour 但是人们说这是不必要的。这是不必要的MVC或如果你使用实体框架,你不应该使用额外的存储库类。
  3. 我想在保存更改之前检查数据库的一些验证。例如,一个用户(拥有用户名和密码的用户,而不是工作人员)不应该能够创建关于工作人员的记录,如果他们不在同一建筑物中。例如,用户A在X楼工作,工人H在Y楼工作,用户A不应该能够创建任何与工人H相关的数据,所以我需要检查他们是否在同一栋楼工作,然后添加记录。我在用户和工作表中都有BranchId字段,我可以轻松检查,但在哪里?

基本上我不知道如何组织我的代码。我想我在这里遗漏了一些重要的东西,因为每个人都验证他们的数据并过滤他们的输入。

谢谢

实体框架中的验证、存储库类和代码结构

用验证来装饰你的dtos。Modelbinding将自动验证您的数据,如果失败,将返回验证失败的属性以及您可以自定义的原因。您的业务规则需要发生在逻辑层中,逻辑层基本上将对数据模型进行操作并返回数据。你的逻辑层将接受dtos,这将从数据层和web API/mvc

中分离出来。