Member 14870919 Ответов: 2

Как я прохожу мимо родительского объекта в дочерний объект в приложение.конфиг


У меня есть кое-какая конфигурация

<Databases>
<Database Name= "A" DataSource="B">
<Tables>
<Table Schema="C" Table="D" />
<Table Schema="E" Table="F" />
</Tables>
</Database>
<Database Name= "E" DataSource="F">
<Tables>
<Table Schema="C" Table="D" />
<Table Schema="E" Table="F" />
</Tables>
</Database>
</Databases>

Я хочу, чтобы класс таблицы был и ссылался на класс базы данных, чтобы он мог ссылаться на источник данных и другие свойства

Что я уже пробовал:

Я построил код, и он работает на первом цикле, но не на втором. Я поменял местами порядок параметров в конфигурации и он всегда идет не так на втором проходе

Используемый код полностью управляется, поэтому я не могу пройти через него, но при запуске первого цикла объект базы данных передается в каждую из таблиц, но во втором цикле он, похоже, не создает объект базы данных и имеет значение null.


В идеале было бы здорово, если бы кто-то мог предоставить некоторый код (c#), который позволяет родительскому объекту быть видимым в дочернем.

Выше приведенное упрощенное представление содержит больше свойств и гораздо больше таблиц и баз данных.

Maciej Los

Почему вам нужно получить родительский объект от дочернего? Разве вы не можете использовать свойство `DatabaseName` класса `Table` для доступа к родительскому объекту по имени?
Почему а спрашиваю. Потому что это может стать причиной будущих проблем. Видеть: Что такое циклическая зависимость и как ее устранить?[^]
Если вы хотите создать вложенный класс, пожалуйста, смотрите раздел: Вложенные Типы - Руководство По Программированию На C# | Microsoft Docs[^]

2 Ответов

Рейтинг:
2

Maciej Los

Прежде всего, пожалуйста, прочтите мой комментарий к этому вопросу.

Второй, Table класс не может содержать элемент с тем же именем, что и его заключающий тип. Видеть: Ошибка компилятора CS0542 | Microsoft Docs[^]

В-третьих, вам не нужна ссылка на родительский объект! Поскольку вы используете XML-данные, вы можете получить родительский объект из XML. Вы даже можете искать конкретную таблицу через объекты баз данных. Видеть:

void Main()
{
	List<Database> databases = new List<Database>
	{
		new Database(){Name="A", DataSource="B", Tables = new List<Table>
			{
				new Table(){Schema = "C", Name = "D"},
				new Table(){Schema = "E", Name = "F"}
			}},
		new Database(){Name="E", DataSource="F", Tables = new List<Table>
			{
				new Table(){Schema = "C", Name = "D"},
				new Table(){Schema = "E", Name = "F"}
			}}
	};
	
	//get parent of specific table
	Table a = new Table(){Schema = "C", Name="D"};
	List<Database> ParentsOfA = databases
		.Where(x=>x.Tables.Any(y=>y.Name == a.Name && y.Schema == a.Schema))
		.ToList();
	Console.WriteLine($"Table '{a.Name}' with schema of '{a.Schema}' belongs to:");
	foreach(Database db in ParentsOfA)
		Console.WriteLine($"'{db.Name}' database with datasource: '{db.DataSource}'");
}

// Define other methods and classes here
public class Database
{
	public string Name {get; set;}
	public string DataSource {get; set;}
	public List<Table> Tables {get; set;}
}

public class Table
{
	public string Schema {get; set;}
	public string Name {get; set;}
}


В-четвертых, вы можете добавить DatabaseName к Table класс для получения уникального идентификатора объекта базы данных. Это свойство должно действовать как внешний ключ ;)

Последнее примечание: используйте XML-сериализацию/десериализацию для записи/чтения xml-данных в/из xml. Видеть:
Подробные сведения о сериализации XML | Microsoft Docs[^]
Примеры сериализации XML | Microsoft Docs[^]


Рейтинг:
0

F-ES Sitecore

public class Database
{
    public List<Table> Tables { get; set; }
}

public class Table
{
    public Database Database { get; set; }
}


Использование

Database db = new Database();
Table t = new Table();
t.Database = db;
db.Tables.Add(t);