EF6代码优先:插入继承实体失败
本文关键字:继承 实体 失败 插入 代码 EF6 | 更新日期: 2023-09-27 17:50:32
我有一个名为Client
的实体未能插入。Client
继承Person
继承Party
这是我的模型类:
public class Client : Person
{
public Client()
{
CrimeIncidents = new List<CrimeIncident>();
Reseller = new Reseller();
}
public virtual ICollection<CrimeIncident> CrimeIncidents
{
get;
set;
}
public virtual Reseller Reseller { get; set; }
}
public class Person : Party
{
[CustomValidation(typeof(PartyRoleCustomValidation), "ValidateRSAIDNumber")]
public string IDSocialSecurityPassNum { get; set; }
[DisplayName("Name")]
public string NickName { get; set; }
[DisplayName("Full names")]
public string FullNames { get; set; }
public string Surname { get; set; }
public Gender? Gender { get; set; }
[DisplayName("Date of birth")]
[DataType(DataType.Date)]
public string DOB { get; set; }
}
public class Party
{
public Int64 Id { get; set; }
public virtual PartyRole PartyRole
{
get;
set;
}
//public List<Address> Adresses { get; set; }
public virtual string PostalAddress { get; set; }
[DataType(DataType.PostalCode)]
public virtual string PostalCode { get; set; }
public virtual string PhysicalAddress { get; set; }
[DataType(DataType.PostalCode)]
public virtual string StreetCode { get; set; }
//public List<EmailAddress> EmailAdresses { get; set; }
[DataType(DataType.EmailAddress)]
public virtual string EmailAddress { get; set; }
//public List<ContactNumber> ContactNumbers { get; set; }
[DataType(DataType.PhoneNumber)]
public virtual string CellNumber { get; set; }
[DataType(DataType.PhoneNumber)]
public virtual string PhoneNumber { get; set; }
[DataType(DataType.PhoneNumber)]
public virtual string FaxNumber { get; set; }
}
下面是单元测试,它在assert语句上失败(在数据库中手动检查确认单元测试结果):
[TestMethod]
public void AddClient()
{
JCGunsDbContext db = new JCGunsDbContext();
int initCount = db.Clients.Count();
string guid = Guid.NewGuid().ToString();
Client cl1 = new Client();
cl1.NickName = guid;
cl1.Surname = guid;
cl1.CellNumber = "0123456789";
cl1.EmailAddress = "test" + guid + "@test.com";
db.UserId = "SYSTEM_UNITTESTING";
db.Clients.Add(cl1);
db.SaveChanges();
Assert.IsTrue(db.Clients.Count() > initCount);
}
为什么这个插入不工作,我如何修复它?
如果该客户端连接到一个存在的Person,则需要将Id传递给该客户端。否则,您需要在client.Person
导航属性中添加Person对象。
。
如果您正在连接此客户端到已存在的Person。
Client client = new Client();
client.Id = oldPerson.Id
如果您要添加新的客户端与新的Person。
Client client = new Client();
client.Person = new Person(){......}
问题是Client
构造函数中的以下语句:
Reseller = new Reseller();
Reseller应该是可选的。设置一个新的Reseller实例,如果它不遵守自己的带注释的验证标准,将导致SaveChanges方法失败,而不会抛出异常。删除语句修复了这个问题。