Динамическая вставка нескольких объектов в базу данных с использованием отражения и Ado.net

#c# #generics #recursion #reflection #insert

#c# #общие #рекурсия #отражение #вставить

Вопрос:

Я пытаюсь решить это в течение длительного времени. Любая помощь будет высоко оценена. В принципе, мне нужно динамически вставлять несколько объектов в базу данных. Метод должен работать с отношениями уровня 3 или 3 . Подобный метод сможет вставить объект House, который содержит список объектов room, а объект room содержит список объектов furniture . Каждый из объектов будет введен в базу данных в рекурсивном процессе. Это означает, что метод вызовет себя, если найдет общий список.

 class Program
    {
        static void Main(string[] args)
        {
            var house1 = new House()
            {
                Id = 1,
                HouseName = "Hasan's villa",
                HouseAddress = "Riyadh",
                Rooms = new List<Room>() { new Room() { Id = 01, Rent = 1200,

                    Furnitures = new List<Furniture>() { new Furniture() { Id = 001, FurnitureName = "Table", Price = 45 },
                                                       { new Furniture() { Id = 002, FurnitureName = "Bookshelf", Price = 55 } } } },

                    new Room(){Id = 02, Rent = 1500, Furnitures = new List<Furniture> {new Furniture(){Id = 003 , FurnitureName = "Almari", Price = 75}} }

                }
            };

var connectionString = "Server=SQLEXPRESS//FERTILE-FIEL;Database=ASPNETB4;Trusted_Connection=True;";
            var dataOperation = new DataOperation<House>(connectionString);

            dataOperation.Insert(house1);
    }


class DataOperation<T> : IDataOperation<T> where T : Entity
    {
        private readonly string _connectionString;
        private SqlConnection connection;

        public DataOperation(string connectionString)
        {
            _connectionString = connectionString;
        }
        public void Insert(T item)
        {
            EntityMaker entityMaker = new EntityMaker();
            entityMaker.InsertEntity(item);
        }
    }



class EntityMaker
    {
        public object genericProp { get; set; }
        public void InsertEntity(object entity)
        {
            Type type = entity.GetType();
            string name = type.Name;

    

    var propertyNames = new ArrayList();
    
            var propertyValue = new ArrayList();

//Need to make the sql dynamic. I have just hard coded it for now.

string sql = "INSERT INTO "   name   " ("   propertyNames[0] ','   propertyNames[1] ','  propertyNames [3] ") 
    VALUES("   propertyValues[0] ','   propertyValues[1] ','   propertyValues[2] ");";

        var properties = type.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly);

        foreach (var prop in properties)
        {

            if (prop.PropertyType.IsGenericType)
            {
                genericProp = prop.PropertyType;
                Type genType = (Type)genericProp;
                var types = genType.GetGenericArguments()[0];

                var genName = types.Name;

                InsertEntity(genName);
            }
            else
            {
                var propName = prop.Name;
                var propValue = prop.GetValue(entity).ToString();

                if (propName != null)
                {
                    propertyNames.Add(propName).ToString();
                    propertyValue.Add(propValue).ToString();
                }
            }

        }
  

Спасибо за рассмотрение проблемы.

Комментарии:

1. Является ли это точным в отношении вашей схемы БД: таблиц: House , Room и Furniture . отношения: House --> Room и Room --> Furniture .

2. Спасибо за ответ. Его Дом> Комната> Мебель> 3-уровневые отношения. Метод также должен работать на уровне 3 .

3. Извините, я пропустил включение одного класса — DataOperation<T>

4. У меня есть решение, которое я использую в производстве. Он избегает динамического sql, предпочитая безопасность типов и инъекций за счет использования SQL User Defined Table Types . Это решение, которое вас заинтересует, или динамический SQL / рекурсивный является частью требований?

5. Было бы здорово, если бы вы могли поделиться этим решением.