繁体   English   中英

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

[英]EF6 Code First: Inserting an inherited entity fails

我有一个名为Client的实体,无法插入。 ClientPerson继承人从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实例,该实例不遵循自己的带注释的验证标准,这会使SaveChanges方法失败而没有引发异常。 删除该语句可解决问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM