wkololo_4ever
@wkololo_4ever

EF CodeFirst: из-за чего ошибка при создание связей?

Есть три модели

public class User
    {
        public int UserId { get; set; }
        public string DisplayName { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }
        public string Password { get; set; }

        public virtual ICollection<ForumMessage> FMessages { get; set; }
        public virtual ICollection<Theme> Themes { get; set; }

    }


public class Theme
    {
        public int ThemeId { get; set; }
        public DateTime? ThemeDate { get; set; }
        public string ThemeName { get; set; }
        public string ThemeDes { get; set; }

        public virtual User User { get; set; }
        public int UserId { get; set; }

        public virtual ICollection<ForumMessage> FMessage { get; set; }

    }


public class ForumMessage
    {
        public int ForumMessageId { get; set; }
        public DateTime MessageDate { get; set; }
        public string Message { get; set; }

        public int ThemeId { get; set; }
        public virtual Theme Theme { get; set; }

        public int UserId { get; set; }
        public virtual User User { get; set; }
    }

То есть, я создаю связь между Users и Themes 1 ко многим; Между Userrs и ForumMessage 1 ко многим; Между Themes и ForumMessage 1 ко многим.
При попытке обновить пустую базу, консоль диспетчера пакетов высвечивает ошибку
Introducing FOREIGN KEY constraint 'FK_dbo.Themes_dbo.Users_UserId' on table 'Themes' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.

В чем проблема?

Ссылка на проект: yadi.sk/d/vIuT6bXAJJPTk
  • Вопрос задан
  • 5635 просмотров
Решения вопроса 1
Vadimyan
@Vadimyan
Программист C#
Проблема у вас в том, что при удалении объекта User происходит каскадное удаление записей и EF находит в графе зависимостей 2 пути, которые ведут к удалению ForumMessage (User -> ForumMessage, User -> Theme -> ForumMessage). Проблема известная, решения предлагают разные.
Лично я в аналогичной ситуации чуть сильнее разобрался в предметной области и узнал, что одна из связей является необязательной и может быть nullable. То есть, это скорее баг проектирования модели данных. Например, почему Theme принадлежит к User?
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
foxmuldercp
@foxmuldercp
Системный администратор, программист, фотограф
Эм. посмотрите в сторону fluent api, там настраивается кто куда и с чем связан
Ответ написан
@Gilga
public class Theme
    {
        public int ThemeId { get; set; }
        public DateTime? ThemeDate { get; set; }
        public string ThemeName { get; set; }
        public string ThemeDes { get; set; }

        public virtual User User { get; set; }
        //public int UserId { get; set; }

        public virtual ICollection<ForumMessage> FMessage { get; set; }

    }
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы