Моя общая структура данных:
Story
|— VotesPool
| \— Votes[]
|— ShelfStoriers[]
|— StoryTags[]
\— Chapters[]
\— CommentsThread
\— Comments[]
Удаление выполняется с помощью простого _context.Stories.Remove(Story)
, ничего сложного
Когда удаляется Story
, Chapter
s тоже, то же самое делают StoryTags
s и ShelfStory
s, но не более того из этой структуры, включая иждивенцы Chapter
. База данных заполнена сиротами.
Что общего между этими двумя останками (Story.VotesPool
и Chapter.CommentsThread
), так это то, что они оба являются взаимно-однозначным отношением, при котором ссылка сохраняется только на родитель, например
class Story {
public int Id {get;set;}
public VotesPool Votes {get;set;}
}
class Comment {
public int Id {get;set;}
public VotesPool Votes {get;set;}
}
class VotesPool {
public int Id {get;set;}
public IEnumerable<Vote> Votes {get;set;}
}
Вместо того, что, я полагаю, является правильным способом его настройки:
class Story {
public int Id {get;set;}
public VotesPool Votes {get;set;}
}
class Comment {
public int Id {get;set;}
public VotesPool Votes {get;set;}
}
class VotesPool {
public int Id {get;set;}
public IEnumerable<Vote> Votes {get;set;}
public Story? Story {get;set;}
public Comment? Comment {get;set}
}
, но это решение не подходит мне на двоих причины:
И VotesPool
, и CommentsThread
являются временными, объединяют таблицы, они не имеют непосредственного отношения. Таким образом, ссылаться на родителей кажется немного бессмысленным
Использование этого решения создаст необходимость обновления моделей VotesPool
и CommentsThread
каждый раз, когда я решаю присоединить их к какой-либо новой модели. Если бы я хотел добавить CommentsThread
к Story
, я бы также добавил Story
к CommentsThread
Вот мой конфиг DbContext где все способы удаления (предположительно) настроены. Остальная часть кода также находится в этом репо. Я использую EF Core и PostgreSQL.
Является ли способ, которым моделируются мои данные, это односторонние отношения суть проблемы здесь? Следует ли исправить это, сделав отношения двусторонними, или есть какой-то аннотационный / свободный метод обработки этого без изменения самих моделей?