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

为什么这个插入不工作,我如何修复它?

EF6代码优先:插入继承实体失败

如果该客户端连接到一个存在的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方法失败,而不会抛出异常。删除语句修复了这个问题。