由于 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
delphi ClientSocket的属性ClientType设置成ctNonBlocking无法捕获异常,该怎么处理