/// <summary>
        /// Insert a relationship when data already exists
        /// </summary>
        /// <param name="entity1ID"></param>
        /// <param name="entity2ID"></param>
        /// <param name="navigationProperty"></param>
        public void InsertWithData(int entity1ID, int entity2ID, string navigationProperty)
        {
            try
            {
                T1 t1 = Entities1.Find(entity1ID);
                dbContext.Entry <T1>(t1).State = EntityState.Modified;

                T2 t2 = Entities2.Find(entity2ID);
                dbContext.Entry <T2>(t2).State = EntityState.Unchanged;

                var navigationPropertyAux = t1.GetType().GetProperty(navigationProperty).GetValue(t1);
                ((ICollection <T2>)navigationPropertyAux).Add(t2);

                this.dbContext.SaveChanges();
            }
            catch (DbEntityValidationException dbEx)
            {
                var msg = string.Empty;

                foreach (var validationErrors in dbEx.EntityValidationErrors)
                {
                    foreach (var validationError in validationErrors.ValidationErrors)
                    {
                        msg += string.Format("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage) + Environment.NewLine;
                    }
                }

                var fail = new Exception(msg, dbEx);
                throw fail;
            }
        }
        /// <summary>
        /// Delete a specific relationship
        /// </summary>
        /// <param name="entity1ID"></param>
        /// <param name="entity2ID"></param>
        /// <param name="navigationProperty"></param>
        public void DeleteRelationship(int entity1ID, int entity2ID, string navigationProperty)
        {
            T1 t1 = Entities1.FirstOrDefault(x => x.Id == entity1ID);
            T2 t2 = Entities2.FirstOrDefault(x => x.Id == entity2ID);

            var navigationPropertyAux = t1.GetType().GetProperty(navigationProperty).GetValue(t1);

            ((ICollection <T2>)navigationPropertyAux).Remove(t2);

            this.dbContext.SaveChanges();
        }
        /// <summary>
        /// Insert a set of relationships when data already exists
        /// </summary>
        /// <param name="entity1ID"></param>
        /// <param name="entity2ID"></param>
        /// <param name="navigationProperty"></param>
        public void InsertWithData(int entity1ID, List <int> entities2ID, string navigationProperty)
        {
            try
            {
                T1 t1 = Entities1.Find(entity1ID);

                //foreach (var id in entities2ID)
                //{
                //    T2 t2 = Entities2.Find(id);

                //    var navigationPropertyAux = t1.GetType().GetProperty(navigationProperty).GetValue(t1);
                //    ((ICollection<T2>)navigationPropertyAux).Add(t2);
                //}
                List <T2> entities2ToAdd = new List <T2>();
                foreach (var id in entities2ID)
                {
                    entities2ToAdd.Add(Entities2.Find(id));
                }

                var navigationPropertyAux = t1.GetType().GetProperty(navigationProperty).GetValue(t1);
                ((List <T2>)navigationPropertyAux).AddRange(entities2ToAdd);

                this.dbContext.SaveChanges();
            }
            catch (DbEntityValidationException dbEx)
            {
                var msg = string.Empty;

                foreach (var validationErrors in dbEx.EntityValidationErrors)
                {
                    foreach (var validationError in validationErrors.ValidationErrors)
                    {
                        msg += string.Format("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage) + Environment.NewLine;
                    }
                }

                var fail = new Exception(msg, dbEx);
                throw fail;
            }
        }
        /// <summary>
        /// Create a relationship between one object and a list of other objects. None of the object exists in the database yet
        /// </summary>
        /// <param name="entity1"></param>
        /// <param name="entities"></param>
        /// <param name="navigationProperty"></param>
        public void InsertWithoutData(T1 entity1, List <T2> entities, string navigationProperty)
        {
            try
            {
                if (entity1 == null || entities == null)
                {
                    throw new ArgumentNullException("entity");
                }

                Entities1.Add(entity1);
                var navigationPropertyList = entity1
                                             .GetType()
                                             .GetProperty(navigationProperty)
                                             .GetValue(entity1, null);

                foreach (var entity2 in entities)
                {
                    Entities2.Add(entity2);
                    ((ICollection <T2>)navigationPropertyList).Add(entity2);
                }

                this.dbContext.SaveChanges();
            }
            catch (DbEntityValidationException dbEx)
            {
                var msg = string.Empty;

                foreach (var validationErrors in dbEx.EntityValidationErrors)
                {
                    foreach (var validationError in validationErrors.ValidationErrors)
                    {
                        msg += string.Format("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage) + Environment.NewLine;
                    }
                }

                var fail = new Exception(msg, dbEx);
                throw fail;
            }
        }