#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. Было бы здорово, если бы вы могли поделиться этим решением.