Vertical inheritance foreign key to other inherited table

3 posts, 0 answers
  1. Jeroen
    Jeroen avatar
    8 posts
    Member since:
    Jun 2015

    Posted 09 Sep Link to this post

    Hello,

     

    I have a person base class

     public class Person
        {
            public int ID { get; set; }        
            public string Name { get; set; }
            public bool Archived { get; set; }
            public DateTime DateCreated { get; set; }
            public string CreatedBy { get; set; }
            public DateTime DateLastChanged { get; set; }
            public string LastChangedBy { get; set; }      
        }

     

    From this base class a Customer and Contact class are derivated:

    public class Contact : Person
        {
            public string FirstName { get; set; }
            public string Preposition { get; set; }
            public bool IsActive { get; set; }

            public virtual int? CustomerID { get; set; }
            private Customer customer;
            public virtual Customer Customer { get { return this.customer; } set { this.customer = value; } }         
        }

     

     public class Customer : Person
        {
            public string CustomerNr { get; set; }
            public string VATNumber { get; set; }       

            private IList<Contact> contact = new List<Contact>();
            public virtual IList<Contact> Contacts { get { return this.contact; } }

    }

     

    I've created this as vertical inheritance:

    var personMapping = new MappingConfiguration<Person>();
                personMapping.MapType(person => new
                {
                    Name = person.Name,
                    Archived = person.Archived,
                    DateCreated = person.DateCreated,
                    CreatedBy = person.CreatedBy,
                    DateLastChanged = person.DateLastChanged,
                    LastChangedBy = person.LastChangedBy
                }).ToTable("Person");
                personMapping.HasProperty(p => p.ID).IsIdentity(KeyGenerator.Autoinc);

     

    var contactMapping = new MappingConfiguration<Contact>();
                contactMapping.MapType(contact => new
                {
                    FirstName = contact.FirstName,
                    Preposition = contact.Preposition,
                    IsActive = contact.IsActive,
                    CustomerID = contact.CustomerID
                })
                    .Inheritance(Telerik.OpenAccess.InheritanceStrategy.Vertical)
                    .ToTable("Contact");
                contactMapping.HasAssociation(c => c.Customer).HasFieldName("customer")
                    .WithOpposite(co => co.Contacts).ToColumn("CustomerID")
                    .HasConstraint((co, c) => co.CustomerID == c.ID)
                    .IsManaged().WithDataAccessKind(DataAccessKind.ReadWrite);

     

     var customerMapping = new MappingConfiguration<Customer>();
                customerMapping.MapType(customer => new
                {
                    CustomerNr = customer.CustomerNr,
                    VATNumber = customer.VATNumber,
                    AgentID = customer.AgentID                
                })
                    .Inheritance(Telerik.OpenAccess.InheritanceStrategy.Vertical)
                    .ToTable("Customer");

    customerMapping.HasAssociation(co => co.Contacts).HasFieldName("contact")
                    .WithOpposite(c => c.Customer).ToColumn("ID")
                    .HasConstraint((co, c) => co.ID == c.CustomerID)
                    .IsManaged().WithDataAccessKind(DataAccessKind.ReadWrite);

     

     configuration.Add(personMapping);

    configuration.Add(contactMapping);
    configuration.Add(customerMapping);

     

    This creates a SQL Database with 3 tables:

    Person

    Contact

    Customer

     

    In the Contact table the field CustomerID is persent, but it is not a foreign key to the Customer table.

     

    Also when I add a contact to the customer and save the customer, the contact is not added. I think this is related

     

    My question is: can I create the CustomerID as a foreign key in the Contact table, or should I programmatically enforce the save and relationship

     

    Thanks in advance

     

    Jeroen

  2. Kristian Nikolov
    Admin
    Kristian Nikolov avatar
    206 posts

    Posted 14 Sep Link to this post

    Hi Jeroen,

    Thank you for contacting us.

    We tried to reproduce the issue you have described. Using the code you have provided, we created a Fluent Model and ensured the database schema. The relation between the Customer and Contact is internally maintained by Telerik Data Access and by default foreign key constraints are not created in the database itself. If you wish to change that behavior, you can use this article.

    That being said, this setup should not cause the issue yo have described. When trying to reproduce it by adding a contact to the Contacts collection of a customer, and then saving the customer, the problem did not occur. Both the customer and the contact were saved correctly to the database.

    If you are still experiencing this issue, please provide us with a sample project that isolates and demonstrates it so that we may investigate the reasons behind it and help you with the troubleshooting.

    I hope this helps.

    Regards,
    Kristian Nikolov
    Telerik by Progress
     
    Check out the latest announcement about Telerik Data Access vNext as a powerful framework able to solve core development problems.
  3. DevCraft banner
  4. Jeroen
    Jeroen avatar
    8 posts
    Member since:
    Jun 2015

    Posted 14 Sep in reply to Kristian Nikolov Link to this post

    Thank you for your response.

    After a few hours of trying and debugging I found I did not set Active in the Contact class to true or false, I left it NULL.

    After setting that to true or false the Contact class was saved correctly.

     

    If an error message was displayed, I dit not see it, possibly that some other code catched it, and prevente dit.

    Kind regards

     

    Jeroen

Back to Top