当我使用基类的属性(名字和姓氏)创建雇员时,我想生成电子邮件:
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插入表的'Email'列中 'GTMSDatabase.dbo.People';列不允许为空。 INSERT失败。
我还尝试将电子邮件保存为简单的{get;设置;},然后对电子邮件进行硬编码:
public string Email { get; set; }
var newEmployee = new Employee
{
FirstName = "John",Phone = "032166702",Email ="j.smith@gtravel"
};
gtmsdb.People.Add(newEmployee);
gtmsdb.SaveChanges();
但是仍然返回相同的错误消息。 我还测试了其他(新)属性,这些属性运行良好,可以删除并重试迁移,并在数据库中检查是否有错误,但现在不确定下一步是否可以执行。在我的上下文中没有对电子邮件的引用,因此我需要在其中进行初始化吗?
编辑:我创建了另一个较小规模的项目,在其中运行完全相同的代码,并且电子邮件没有任何问题地保存:
using (var db = new ETDbContext())
{
var newEmployee = new Employee
{
FirstName = "John",Phone = "032166702"
};
db.People.Add(newEmployee);
var nc = new Customer
{
FirstName = "Jane",LastName = "Doe",Email = "customerEmail"
};
db.People.Add(nc);
db.SaveChanges();
}
我试图添加一个Customer只是为了确保一切正常,但是遇到了同样的问题!每当我创建一个员工时,它都不会保存任何问题,但是与客户一起,它会返回相同的空引用错误