Проблемы с односторонними отношениями один-к-одному и каскадным удалением в EF Core - PullRequest
1 голос
/ 05 апреля 2020

Моя общая структура данных:

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}
}

, но это решение не подходит мне на двоих причины:

  1. И VotesPool, и CommentsThread являются временными, объединяют таблицы, они не имеют непосредственного отношения. Таким образом, ссылаться на родителей кажется немного бессмысленным

  2. Использование этого решения создаст необходимость обновления моделей VotesPool и CommentsThread каждый раз, когда я решаю присоединить их к какой-либо новой модели. Если бы я хотел добавить CommentsThread к Story, я бы также добавил Story к CommentsThread

Вот мой конфиг DbContext где все способы удаления (предположительно) настроены. Остальная часть кода также находится в этом репо. Я использую EF Core и PostgreSQL.

Является ли способ, которым моделируются мои данные, это односторонние отношения суть проблемы здесь? Следует ли исправить это, сделав отношения двусторонними, или есть какой-то аннотационный / свободный метод обработки этого без изменения самих моделей?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...