实体框架:如何捕获任何错误

2024-03-23

我正在尝试将数据插入到具有大量数据的 SQL Server 表中not null限制:

CREATE TABLE [dbo].[Customer]
(
    [CustomerId] [int] IDENTITY(1,1) NOT NULL,
    [FirstName] [varchar](255) NOT NULL,
    [LastName] [varchar](255) NOT NULL,
    [AddressLine] [varchar](255) NOT NULL
    CONSTRAINT [PK_Customer] PRIMARY KEY CLUSTERED ([CustomerId] ASC)
 )

EF code:

public virtual DbSet<Customer> Customer { get; set; }
modelBuilder.Entity<Customer>(entity =>
{
    entity.Property(e => e.FirstName)
        .HasMaxLength(255)
        .IsRequired()
        .IsUnicode(false);

    entity.Property(e => e.LastName)
            .HasMaxLength(255)
            .IsRequired()
            .IsUnicode(false);

    entity.Property(e => e.AddressLine)
            .HasMaxLength(255)
            .IsRequired()
            .IsUnicode(false);
  });

当尝试将数据添加到表中时,代码缺少列,因此无法插入到数据库中。不知道这一点,也没有收到“NOT NULL”错误,正如我在 SQL 数据库中看到的那样。

var source = new Customer();

source.FirstName = "Joe";  // missing Last Name and Address
_context.Customer.Add(source);

所以我添加了以下代码。这解决了问题,但是我如何让它在任何数据库错误、并发、错误数据类型等方面失败。

try
{
   _context.SaveChanges();
}
catch (DbUpdateException e)
{
}

以下内容不起作用: 方法1和2:当这些被实现时,not null错误不再像我们想要的那样出现。

try
{
   _context.SaveChanges();
}
catch (Exception e)
{
}


try
{
   _context.SaveChanges();
}
catch
{
}

DbContext.SaveChanges https://learn.microsoft.com/en-us/dotnet/api/system.data.entity.dbcontext.savechanges?view=entity-framework-6.2.0描述了您可能会遇到哪些例外情况。决定要捕获哪些异常,不捕获哪些异常。

如果您不确定在什么情况下会出现哪些异常,请使用调试器和一些测试代码来找出您实际上可能期望的异常:

// TODO: create one of your error conditions
try
{
   _context.SaveChanges();
}
catch (Exception e)
{
    Console.WriteLine(e.GetType()); // what is the real exception?
}

当您知道可以预期哪些异常以及真正可以处理哪些异常时,请编写最终代码:

try
{
   _context.SaveChanges();
}
catch (DbUpdateException e)
{
    // handle the update exception
}
catch (DbEntityValidationException e)
{
    // handle the entity validation exception
}
catch (...)

您可能不会捕获 System.NotSupportedException,您的代码应该只使用受支持的 LINQ 语句。

优化

请记住,DbSets在你的DbContext代表数据库中的表。课程在DbSets表示表中的行:非虚拟属性表示表中的列,表之间的关系表示为虚拟属性。

您设计这些数据库表是因为您想解决问题。显然,在您的解决方案中,名字/姓氏等不能为空很重要。

您可能会将 DbContext 的使用包装到一个类中,该类隐藏您使用实体框架来保存数据,而不是使用 Dapper 或任何较低级别的方法来查询和更新数据。

通常这个包装类被称为Repository类别:您的用户Repository不知道,也不在乎如何以及在何处保存数据:SQL?蒙戈?甚至可能是 CSV 文件?

拥有一个美好的事情Repository类是,如果您决定更改表布局,或者决定将其中一个查询更改为存储过程,或者决定将数据存储在 CSV 中,则更改将是最小的,用户甚至不会注意变化

在您的存储库中,您将具有查询人员、添加/删除/更新人员等的功能。您之前决定您的解决方案不应接受具有空名称的人员。

您的解决方案不取决于数据的保存方式。因此,您的解决方案不应依赖于您的存储库是否检查您的名称是否为 null 或 nt。

考虑在调用 SaveChanges 之前检查数据有效性。在这种情况下:检查名字、姓氏等是否确实不为空。你的代码将

  • 看起来更干净:减少对范围之外的各方抛出的异常的处理
  • 更容易阅读:读者不必猜测如果数据为空会发生什么,
  • 更容易测试:您的测试代码可以使用简单的模拟存储库,无需进行空检查
  • 更好的可维护性:如果您决定允许添加没有名字的人员,您的数据库模型不会改变,只会改变您的存储库类
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实体框架:如何捕获任何错误 的相关文章

  • 将图像文件从网址复制到本地文件夹?

    我有该图像的网址 例如 http testsite com web abc jpg http testsite com web abc jpg 我想将该 URL 复制到 c images 中的本地文件夹中 而且当我将该文件复制到文件夹中时
  • EF 和 WCF 错误 - SQL Server Compact 不适用于 ASP.NET 开发

    您好 我有一个简单的 wpf 应用程序设置来使用在另一个项目中运行的测试 wcf 服务 该服务使用实体框架从附加到 wcf 服务项目的 SQL Compact 3 5 sdf 中检索几行 我收到 SQL Server Compact 不适用
  • 是否允许将类模板类型参数键入相同的名称?

    这似乎可以在 MSVC 中按预期编译甚至工作 但它是合法的 C 代码吗 它是否能保证执行此处所期望的操作 即将模板类型导出到结构体的同名用户 template
  • C# 中四舍五入到偶数

    我没有看到 Math Round 的预期结果 return Math Round 99 96535789 2 MidpointRounding ToEven returning 99 97 据我了解 MidpointRounding ToE
  • 静态类变量与外部变量相同,只是具有类作用域吗?

    在我看来 静态类变量与外部变量相同 因为你只需要declare它在static int x extern int x语句 并在其他地方实际定义它 通常在 cpp 文件中 静态类变量 h file class Foo static int x
  • 访问“if”语句之外的变量

    我怎样才能使insuranceCost以外可用if陈述 if this comboBox5 Text Third Party Fire and Theft double insuranceCost 1 在 if 语句之外定义它 double
  • 找到的程序集的清单定义与程序集引用不匹配

    我试图在 C Windows 窗体应用程序 Visual Studio 2005 中运行一些单元测试 但出现以下错误 System IO FileLoadException 无法加载文件或程序集 实用程序 版本 1 2 0 200 文化 中
  • 无法从 Web api POST 读取正文数据

    我正在尝试从新的 Asp Net Web Api 中的请求中提取一些数据 我有一个像这样的处理程序设置 public class MyTestHandler DelegatingHandler protected override Syst
  • 单线程公寓问题

    从我的主窗体中 我调用以下命令来打开一个新窗体 MyForm sth new MyForm sth show 一切都很好 但是这个表单有一个组合框 当我将其 AutoCompleteMode 切换为建议和追加时 我在显示表单时遇到了这个异常
  • C# datagridview 列转入数组

    我正在用 C 构建一个程序 并在其中包含一个 datagridview 组件 datagridview 有固定数量的列 2 我想将其保存到两个单独的数组中 但行数确实发生了变化 我怎么能这样做呢 假设一个名为 dataGridView1 的
  • 格式化货币

    在下面的示例中 逗号是小数点分隔符 我有这个 125456 89 我想要这个 125 456 89 其他示例 23456789 89 gt 23 456 789 89 Thanks 看看这个例子 double value 12345 678
  • 在VisualStudio DTE中,如何获取ActiveDocument的内容?

    我正在 VisualStudio 中编写脚本 并尝试获取当前 ActiveDocument 的内容 这是我当前的解决方案 var visualStudio new API VisualStudio 2010 var vsDTE visual
  • 系统错误 124 - SHFileOperation 的 ERROR_INVALID_LEVEL

    我在使用时遇到问题SHFileOperation SHFileOperation SHFILEOPSTRUCT https stackoverflow com questions 9191415 shfileoperation shfile
  • 正确使用“extern”关键字

    有一些来源 书籍 在线材料 解释了extern如下 extern int i declaration has extern int i 1 definition specified by the absence of extern 并且有支
  • 将非算术类型作为参数传递给 cmath 函数是否有效?

    给定以下用户定义类型S具有转换功能double struct S operator double return 1 0 以及以下调用cmath http en cppreference com w cpp header cmath使用类型的
  • TPL 数据流块下游如何获取源生成的数据?

    我正在使用 TPL Dataflow 处理图像 我收到处理请求 从流中读取图像 应用多次转换 然后将生成的图像写入另一个流 Request gt Stream gt Image gt Image gt Stream 为此 我使用块 Buff
  • 纯虚函数可能没有内联定义。为什么?

    纯虚函数是那些虚函数并且具有纯说明符 0 第 10 4 条第 2 款C 03 的内容告诉我们什么是抽象类 顺便说一句 如下 注意 函数声明不能 同时提供纯说明符和定义 尾注 示例 struct C virtual void f 0 ill
  • ASP.NET Core Razor Page 多路径路由

    我正在使用 ASP NET Core 2 0 Razor Pages 不是 MVC 构建系统 但在为页面添加多个路由时遇到问题 例如 所有页面都应该能够通过 abc com language 访问segment shop mypage 或
  • 使用 Chrome 和 Selenium 设置 LocalStorage

    我正在尝试使用 OpenQA Selenium 和 Chrome 设置本地存储键和值 我认为这相当微不足道 但我似乎无法让它发挥作用 我对 C 很陌生 所以我可能错过了一些东西 无论如何 我有这个功能 public static void
  • 从有符号字符转换为无符号字符然后再转换回来?

    我正在使用 JNI 并有一个 jbyte 类型的数组 其中 jbyte 表示为有符号字符 即范围从 128 到 127 jbyte 表示图像像素 对于图像处理 我们通常希望像素分量的范围为0到255 因此 我想将jbyte值转换为0到255

随机推荐

  • Karma 未运行 karma-webpack 中具有“导入”语句的测试

    我有一些测试文件 其中包含我想针对我的应用程序运行的测试 我正在尝试使用karma karma webpack karma babel preprocessor karma chrome launcher and jasmine在我的测试中
  • 限制 Windows 窗体数据可视化图表中的纵横比

    使用图表控件System Windows Forms DataVisualization Charting Chart 我正在制作散点图 如何约束它 使 X 轴的比例与 Y 轴的比例相同 简单地将控件本身设置为方形是不够的 因为它具有用于绘
  • 无法将 Neo4j GORM 插件添加到 Grails 项目

    我想在我的 Grails 项目中使用 Neo4j 图形数据库 我创建了一个新的 Grails 项目 我使用的是 Intellij Ultimate Edition 该应用程序运行良好 当我尝试在 BuildConfig groovy 中添加
  • 为什么如果我传递 lambda 作为键,与将其直接应用于具有相同 lambda 的原始可迭代的映射相比,max 的行为会有所不同?

    我试图理解 max 函数中关键参数的工作原理 它来自从列表中查找最接近 0 的整数的问题 并在列表中具有相同正值和负值的情况下使用正值 我发现这是一个有效的在线解决方案 给定一个整数 x 列表 print max a key lambda
  • 为 Spring Boot 应用程序中的所有控制器指定一次 @RequestHeader

    我有一个 Spring Boot 应用程序 其中包含多个控制器 提供各种 REST 方法 每个方法都需要定义相同的标头参数 有没有一种方法可以为所有控制器方法指定一次类似以下内容的方法 public ResponseEntity get R
  • 使用 GET 而不是 POST 删除经过身份验证的页面后面的数据 [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我知道只要在公共网站上修改数据 您就应该使用 POST 有几个原因 包括搜索引擎会跟踪所有链接并修改数据 我的问题是 您认为在管理界面等经过
  • React Hook useEffect 缺少依赖项:“dispatch”

    这是我第一次使用 React js 我试图在离开此视图时删除警报 因为我不想在其他视图上显示它 但如果没有错误 我想保留成功警报以显示当我要重定向到另一个视图时 但我在 google chrome 上收到此警告Line 97 6 React
  • 找不到 Django 媒体 URL

    我遇到了一个奇怪的问题 希望其他地方有人也遇到过同样的问题 我的问题是 django 应用程序中存储的媒体无法通过 MEDIA ROOT URL 提供服务 当我尝试获取列表时使用 URL myhost media 保存在我的应用程序中的媒体
  • 如何在Windows窗体中创建垂直导航栏?

    我正在开发我的学校项目 Windows 窗体应用程序 正如你所看到的 我创建了 3 个面板 一个用于标题 一个用于导航栏 一个用于内容 我可以使标题和导航栏静态化 例如网页中的布局 并在单击按钮时更改内容吗 我创建了几个面板 并更改每个面板
  • 将程序集编译为 x64 有什么优点吗?

    假设我有一个 Net Framework 3 5 SP1 CLR 2 0 应用程序 需要在 x86 和 x64 平台上运行 还假设出于某种原因 我需要创建单独的 x86 和 x64 安装程序 由于我无论如何都有一个特定于 x64 的安装程序
  • R data.table 在 i 语句中使用 max

    这应该很简单 但由于某种原因 data table 没有达到我的预期 我想取一行中两个值的最大值来确定是否应该过滤一行 似乎发生的情况是 max 函数正在查看整个列 这不是我想要的 这是代码 gt test dt lt data table
  • 在哪里可以找到带有源代码的简约 WDM 驱动程序模板? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我遇到过内核模式驱动程序 但经验很少 这就是我想做的 有一个加载驱动程序的用户模式应用程序 让用户模式应用程序写入它 以便向它发送指令 让
  • 如何在选择中进行选择

    我有一个包含唯一 ID 字段的表 另一个字段 REF 包含对另一个数据集的 ID 字段的引用 现在我必须选择 REF 指向不存在的数据集的所有数据集 SELECT FROM table WHERE no dataset with ID RE
  • 使用 CloudFront 时,S3 上的自定义重定向规则返回 403

    我在 S3 上为我的存储桶有一个自定义重定向规则
  • “git pull”坏了

    我最近将 MacBook Pro 升级到 Snow Leopard 并且 git pull 返回 rakudo git pull git pull is not a git command See git help Did you mean
  • 将大端字节集合编组到结构中以提取值

    有一个很有洞察力的问题从字节数组中读取 C 中的 C C 数据结构 https stackoverflow com questions 2871 reading a c c data structure in c from a byte a
  • AND 和 OR 运算符在 Bash 中如何工作?

    我在 bash 中尝试了以下命令 echo this echo that echo other 这给出了输出 this other 我不明白 我的试运行是这样的 echo this echo that echo other暗示true tr
  • IE 中的空白 iFrame

    我有一个 iframe 如果来自externaldomain com的something html有css html position relative 在 IE 中 它将把 iframe 渲染为空白 所有其他浏览器都很好 有人知道解决方案
  • 谷歌浏览器闪烁

    大家好 我是新来的 不是编码员 而是我们即将于 2017 年夏天发布的项目的经理 我的开发人员和编码人员无法找到我们网站仅在 Chrome 上存在闪烁的原因 www playinera com http www playinera com
  • 实体框架:如何捕获任何错误

    我正在尝试将数据插入到具有大量数据的 SQL Server 表中not null限制 CREATE TABLE dbo Customer CustomerId int IDENTITY 1 1 NOT NULL FirstName varc