由于 SQL 异常错误,无法将电子邮件属性保存到 sql 中:“不允许空插入”,除非属性不为空??(ORM 代码优先)

Posted

技术标签:

【中文标题】由于 SQL 异常错误,无法将电子邮件属性保存到 sql 中:“不允许空插入”,除非属性不为空??(ORM 代码优先)【英文标题】:Unable to save Email property to sql in due to SQL Exception Error :"Null insert not allowed" except property is not null??(ORM-code first) 【发布时间】:2019-11-06 01:51:12 【问题描述】:

我想在使用基类中的属性(名字和姓氏)创建员工时生成电子邮件:

public class Person

    public int Id  get; set; 
    public string FirstName  get; set; 
    public string LastName  get; set; 
    public DateTime DOB  get; set; 
    public string Phone  get; set; 



 public class Employee : Person

    public Employee()
    
        Packages = new List<Package>();

    
    public string Email  get =>$"FirstName[0].LastName@GTravel.com.au"; 

    public IEnumerable<Package> Packages  get; set; 

所以输出应该是这样的:J.Smith@GTravel.com.au 然后我希望能够将此员工保存到一个 sql 数据库中,其中 Person 作为实体/表,Employee 作为鉴别器。

using (var gtmsdb = new GTMSDbContext())
        

            var newEmployee = new Employee
            
                FirstName = "John",
                LastName = "Smith",
                DOB = new DateTime(1992, 09, 16),
                Phone = "03-1234-567"

            ;
            gtmsdb.People.Add(newEmployee);
            gtmsdb.SaveChanges();

        

Shows Employee in debugger with email created

当我运行代码时,它会使用正确格式的电子邮件和所有内容创建员工,但是当我尝试保存到数据库时,它会返回错误:

SqlException:无法将值 NULL 插入列“电子邮件”,表 'GTMSDatabase.dbo.People';列不允许空值。插入失败。

我还尝试将电子邮件保存为简单的 get; set; 然后对电子邮件进行硬编码:

 public string Email  get; set; 


 var newEmployee = new Employee
            
                FirstName = "John",
                LastName = "Smith",
                DOB = new DateTime(1992, 09, 16),
                Phone = "032166702",
                Email ="j.smith@gtravel"

            ;
            gtmsdb.People.Add(newEmployee);
            gtmsdb.SaveChanges();

但这仍然返回相同的错误消息。 我还测试了其他运行良好的(新)属性,删除并重试了迁移,在我的数据库中检查了那里的错误,但我现在不确定下一步要采取的步骤。我的上下文中没有对电子邮件的引用,所以我需要在那里初始化吗?

编辑:我创建了另一个较小规模的项目,在其中运行完全相同的代码,并且电子邮件保存没有问题:

using (var db = new ETDbContext())
        
            var newEmployee = new Employee
            
                FirstName = "John",
                LastName = "Smith",
                DOB = new DateTime(1992, 09, 16),
                Phone = "032166702"

            ;
            db.People.Add(newEmployee);
            var nc = new Customer
            
                FirstName = "Jane",
                LastName = "Doe",
                DOB = new DateTime(1992, 09, 16),
                Phone = "032166702",
                Email = "customerEmail"
            ;
            db.People.Add(nc);
            db.SaveChanges();

        

我尝试添加客户只是为了确保一切正常,但遇到了同样的问题!任何时候我都会创建一个员工,它不会保存任何问题,但对于客户它返回相同的空引用错误

【问题讨论】:

【参考方案1】:

如果设置了电子邮件,您在尝试保存之前检查过吗?如果它变为空,则设置不起作用,我将执行以下操作。

 var newEmployee = new Employee
        
            FirstName = "John",
            LastName = "Smith",
            DOB = new DateTime(1992, 09, 16),
            Phone = "03-1234-567",
            Email = '';
        ;
 newEmployee.Email = newEmployee.FirstName.Substring(0,1).ToLower() + 
 newEmployee.LastName.ToLower() +"@gtravel";

【讨论】:

问题中有一个带有屏幕截图的链接,显示正在使用正确的电子邮件和所有内容创建员工。它不会让我直接发布图片,但它几乎只是显示了所有正在正确创建的东西,但这是我无法获得的保存 我没看到图片。你能告诉我你的模型创建上下文吗?可能是因为您发送了 6 个属性,而您的 db 期待 5 个。

以上是关于由于 SQL 异常错误,无法将电子邮件属性保存到 sql 中:“不允许空插入”,除非属性不为空??(ORM 代码优先)的主要内容,如果未能解决你的问题,请参考以下文章

在 WPF 中 ImageBox.Source == null 时无法保存 SQLİte

将主题为文件名的电子邮件保存到Windows文件夹

delphi ClientSocket的属性ClientType设置成ctNonBlocking无法捕获异常,该怎么处理

由于带有动态 PHP 输入的 SQL 查询导致的 PDO 异常导致的致命错误

SQLCMD命令,如何将输出保存到日志文件中

SQL server无法启动服务,提示“错误1069: 由于登录失败而无法启动服务”