Так что я какое-то время бился головой о стену на этом. Что я пытаюсь сделать, так это проследить трассировку категории, определенную как «категория> дочерняя категория> дочерняя категория дочерней категории ...», но по какой-то причине, которую я явно не могу понять, категории, которые должны иметь родительский элемент, иногда терпят неудачу. установить их ParentId, но не всегда !?
string catString = "Category1Name>Category2Name>Category3Name";
if (!string.IsNullOrEmpty(catString)) {
string[] catStrings = catString.Split('>');
ProductCategory[] categories = new ProductCategory[catStrings.Length];
for (int j = 0; j < catStrings.Length; j++) {
string categoryName = catStrings[j];
ProductCategory parent = j > 0 ? categories[j - 1] : null;
if (j > 0) {
categories[j] = _context.ProductCategories.SingleOrDefault(x => x.Name.ToUpper().Replace(" ", "") == categoryName.ToUpper().Replace(" ", "") && x.ParentId == parent.Id);
} else {
categories[j] = _context.ProductCategories.SingleOrDefault(x => x.Name.ToUpper().Replace(" ", "") == categoryName.ToUpper().Replace(" ", ""));
}
if (categories[j] == null) {
if (j > 0) {
categories[j] = new ProductCategory { Name = categoryName, ParentId = parent.Id };
if (parent.Children == null) {
parent.Children = new List<ProductCategory>();
}
parent.Children.Add(categories[j]);
} else {
categories[j] = new ProductCategory { Name = categoryName };
}
_context.ProductCategories.Add(categories[j]);
categoriesCreated++;
}
}
product.Category = categories.Last();
}
Категория определяется как таковая
public int Id { get; set; }
public string Name { get; set; }
public int ParentId { get; set; }
public virtual List<ProductCategory> Children { get; set; }
Примеры строк
Glassware>Shot Glasses
Glassware>Wine Glasses
Glassware>Glass Carafes/Decanters/Jugs>Glass Carafes
Glassware>Glass Carafes/Decanters/Jugs>Glass Jugs
Tableware>Cutlery>Premium 18/10
Я пытаюсь создавать модели из строки, а не превращать модели в строку. Причина этого в том, что я пытаюсь импортировать данные о продукте из CSV. Проблема, с которой я столкнулся, заключается в том, что я испортил настройку отношений, но я не могу понять, где. Извините за ужасное объяснение.
Где вы сохраняете изменения в базе данных? Идентификаторы родителей автоматически генерируются в базе данных, поскольку вы просто вызываете new ProductCategory { Name = categoryName }; или где вы устанавливаете идентификаторы? И вам, вероятно, следует настроить свои модели так, чтобы FK устанавливался автоматически.
@JamesAnderson - можете ли вы отредактировать свой вопрос, чтобы разместить несколько строк фактических строковых данных внизу?
Это содержится в цикле, который проходит по каждой из строк csv, и поэтому изменения сохраняются после выхода из цикла. Я использую entity-framework, который, насколько мне известно, обрабатывает идентификаторы. Он определенно настроил внешние ключи. Я отредактировал сообщение, включив в него несколько примеров входящих строковых данных.





Что-то вроде этого работает, используя объект TreeNode, чтобы содержать все.
public class SO50846156
{
public TreeNode Test(String[] data)
{
var root = new TreeNode();
foreach (var line in data)
{
var split = line.Split('>');
var count = split.Length;
var item = root.Nodes.Add(split[0]);
if (1 < count)
{
var subCat = item.Nodes.Add(split[1]);
if (2 < count)
{
var catName = subCat.Nodes.Add(split[2]);
}
}
}
return root;
}
}
Корневой элемент создается каждый раз, и вы получаете узел для каждой строки ваших данных.
Я не уверен, что вы пытаетесь достичь другого, но, возможно, это дает вам некоторые идеи.
Проблема в том, что каждая строка не всегда описывает уникальное дерево. Как показано в строках примера, Glassware и т. д. Появляются несколько раз, и каждый раз они должны указывать на один и тот же узел, надеюсь, это имеет смысл.
Я бы посмотрел в пространство имен System.Xml или пространство имен System.Xml.Linq и посмотрел, как использовать это для создания древовидной структуры как XmlDocument или XDocument, затем вы можете преобразовать это в строку. Кроме того, похоже, что вы используете entity-framework, вы всегда можете написать свою собственную процедуру SQL, и она будет возвращать ваши данные в виде XML.