#c# #sql #sql-server #entity-framework-core
#c# #sql #sql-сервер #entity-framework-core
Вопрос:
В моем проекте cms я создал таблицу «RequestGroup» для получения всех потребностей в текущем «Контенте», например, у меня есть виджет «Контент» на моей домашней странице «Контент», поэтому в этой ситуации я просто не мог найти способ.
В настоящее время я использую ядро EF для решения этой проблемы. Но ядра EF недостаточно для решения этой проблемы. Итак, я попробовал sql, но я не смог создать решение и на sql. Нужна ваша помощь, любая идея может помочь. Спасибо за ваше время..
public class ContentMain : IdBase
{
[MaxLength(256)]
public string Name { get; set; } = null;
public Guid RequestGroupId { get; set; }
[ForeignKey("DetailPage")]
public Guid? DetailPageId { get; set; } = null;
public virtual VisualizationMain DetailPage { get; set; } = null;
public virtual List<SeoOptionContentMain> SeoOptions { get; set; } = new List<SeoOptionContentMain>();
public string _parameters { get; set; }
[NotMapped]
public Parameters Parameters
{
get
{
try
{
return JsonConvert.DeserializeObject<Parameters>(_parameters);
}
catch
{
return new Parameters();
}
}
set
{
_parameters = JsonConvert.SerializeObject(value);
}
}
[ForeignKey("Category")]
public Guid CategoryId { get; set; }
public virtual CategoryMain Category { get; set; } = null;
public Guid DefinitionId { get; set; }
[NotMapped]
public DefinitionMain Definition { get; set; }
}
public class RequestGroupMain
{
[Key]
public Guid Id { get; set; }
[MaxLength(256)]
[Required]
public string Name { get; set; }
public Guid? RequestGroupMainId { get; set; }
public virtual IList<RequestGroupMain> Childen { get; set; } = new List<RequestGroupMain>();
public virtual List<VisualizationRequestGroup> Visualizations { get; set; } = new List<VisualizationRequestGroup>();
public virtual List<ContentRequestGroup> Contents { get; set; } = new List<ContentRequestGroup>();
public virtual List<CategoryRequestGroup> Categories { get; set; } = new List<CategoryRequestGroup>();
public virtual List<CategoryGroupRequestGroup> CategoryGroups { get; set; } = new List<CategoryGroupRequestGroup>();
}
Комментарии:
1. Не могли бы вы описать, в чем конкретно заключается ваша проблема? Это трудно понять.
2. Конечно, когда я импортирую запись «Содержимого» в свой процесс запроса, я хочу включить требования к этой записи. Этими требованиями могут быть «Визуализация», «Содержимое», «Категория», «Категорийгруппа», поэтому я не могу понять это.
3. Как насчет
context.ContentMain.Include(cm => cm.Visualizatios).Include(cm => cm.Contents).Include(...
? Уверен, что вы пробовали это, но что с этим не работает?4. Я не пробовал это из-за «RequestGroup», я имею в виду, что я использую Guid requestGroupId = context.ContentMain. FirstOrDefault(x=> x.Id.Equals({guid})). RequestGroupId; context.RequestGroupMain. Включить (x=>x.RequestGroupMain). FirstOrDefault(x=>x.Id.Equals(requestGroupId)); Вот моя проблема, когда я получаю свою «RequestGroup», в нее включены «дочерние элементы», и эти «дочерние элементы» — это бесконечно вложенная «RequestGroup».. Я надеюсь, что я это объясню. Другой пример, метод категории бесконечности, не работает в ядре EF..
5. Это то, что мне нужно, большое вам спасибо. Я изменил систему из-за этой ситуации. Но ваше решение является правильным решением для этой проблемы.
Ответ №1:
Итак, ваша проблема заключается в самоссылающихся отношениях родитель / потомок ( RequestGroupMain.Children
).
Как вы выяснили, это не работает с ядром EF, используя только один запрос. Вы можете использовать
context.Entry(theRequestGroupMain).Reference(rgm => rgm.Visualizations).Load()
с некоторым циклом и рекурсией. Конечно, если в одном запросе необходимо извлечь много вложенных данных, это может привести к слишком большому количеству запросов.
Вы также можете использовать комбинацию некоторых
Include(rgm => rgm.Children).ThenInclude(...)
до определенной глубины, а затем идти дальше с несколькими вызовами ReferenceEntry.Load()
.
Если это невозможно (например, по соображениям производительности), вы все равно можете пойти по пути «raw SQL». Для этого в вашем запросе необходимо использовать «рекурсивное выражение общей таблицы (CTE)». Просто найдите в Google что-то вроде «рекурсивный родительский дочерний сервер SQL Server иерархии CTE».