【问题标题】:Entity Framework : how to catch Not Null errors实体框架:如何捕获 Not Null 错误
【发布时间】:2019-07-11 09:32:06
【问题描述】:

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

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,
    [City] [varchar](55) NOT NULL,
    [StateCode] [varchar](3) NOT NULL,
    [ZipCode] [varchar](10) NOT NULL,

    CONSTRAINT [PK_Customer]  
        PRIMARY KEY CLUSTERED ([CustomerId] ASC)
 )

EF 代码:

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);

    entity.Property(e => e.City)
            .HasMaxLength(55)
            .IsRequired()
            .IsUnicode(false);

    entity.Property(e => e.StateCode)
            .HasMaxLength(3)
            .IsRequired()
            .IsUnicode(false);

    entity.Property(e => e.ZipCode)
            .HasMaxLength(10)
            .IsRequired()
            .IsUnicode(false);

  });

尝试向表中添加数据时,代码缺少列,因此无法插入到数据库中。不知道这一点,也没有收到“NOT NULL”错误,就像我在 SQL 数据库中看到的那样。如何将 SQL Server 错误报告回 C# ASP.NET MVC 应用程序? ([Required] 属性会起作用,但我想在 C# 中查看 SQL Server 错误)

var source = new Customer();

source.FirstName = "Joe";
source.LastName = "Smith";  // missing Address, City, State, Zip, etc
_context.Customer.Add(source);

SQL Server 中显示的错误:

无法将值 NULL 插入到列“Last”、表“dbo.Customer”中;列不允许空值。插入失败。

如何在 C# ASP.NET MVC 程序中出现这些错误?

【问题讨论】:

  • 您是否尝试过运行 EF 迁移?如果您缺少列是因为它们尚未插入数据库中
  • 我在 sql server 中检查了我的 dbcontext 文件和数据库,并使用所有列正确播种数据,它们是同步的
  • try...catch... 如果 SQL 抛出此消息,您将能够在您的异常中得到它。

标签: c# entity-framework .net-core asp.net-core-mvc asp.net-core-2.1


【解决方案1】:

将 [Required] 属性添加到您的属性。

[Required]
public string FirstName{ get; set; }

然后,如果您尝试保存 Customer 而不为 FirstName 属性分配值,则 EF 将抛出 System.Data.Entity.Validation.DbEntityValidationException 异常

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

【讨论】:

  • 我知道这会起作用,我想一般的问题是,我如何接收 SQL 服务器错误,并将它们报告回 C# 程序?
  • 您无法使用实体框架捕获 SqlException。您只能在此 url 中捕获提到的异常。docs.microsoft.com/en-us/dotnet/api/…
  • 谢谢,我只需要 try catch 语句,我有,我有 entity.Property(e => e.AddressLine) .HasMaxLength(255) .IsRequired(),在我的上下文中是必需的文件,
  • 这可能是另一个好问题,我有,谢谢,接受了这个答案stackoverflow.com/questions/54739423/…
【解决方案2】:

如果您在数据库中的字段不是 Nullable 类型(NOT NULL),那么您应该添加 [Required] 属性以确保实体框架在向 SQL Server 发出请求之前会检查 null

如果字段是主键,那么你应该使用 [Key] 属性来代替

看看这个教程here

【讨论】:

    猜你喜欢
    • 2019-07-11
    • 2018-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-05
    相关资源
    最近更新 更多