@falc

Entity Framework как организовать ссылку таблицы на саму себя (model first)?

Создаю в редакторе модель простой таблицы синонимов с полями:
  • WordId
  • WordName
  • ParentId
80c517295f6b4a8ea470444e3dad1e53.jpg
При заполнении dbContext.Words.Add(WordFirst); dbContext.Words.Add(WordTwo) не дает добавить второе слово, ссылающееся на первое, если первое ссылается на второе. Как в этом случае поступить?
  • Вопрос задан
  • 1520 просмотров
Пригласить эксперта
Ответы на вопрос 2
Valeriy1991
@Valeriy1991
Разработчик .NET C# (ASP.NET MVC) в Alfa-B, Moscow
День добрый! Под фразой "не дает добавить" можно понять множество вещей. Поконкретнее, пожалуйста, о том, что происходит при добавлении? Вылетает exception? Какой? Приведите в описании вопроса код, который осуществляет добавление.

UPD from 26.05.2015:

falc добрый день! Вы уверены в том, что в качестве хранилища нужно использовать БД? Если да, то, мне кажется, лучше сделать не 1 таблицу и в ней всё в одну кучу собирать, а 2 таблицы:

  1. таблица со словами и полями: id, word
  2. таблица синонимов с полями: id, id_main_word, id_synonym_word


В первой таблице у Вас просто будет список слов, а во второй - список непосредственно синонимов (id - это ID записи, id_main_word - ID "главного слова", id_synonym_word - ID слова-синонима). Тогда у Вас получится в EF создать нормальные ассоциации.
Ответ написан
@falc Автор вопроса
Код немного не совпадает с моделью, просто я много вариантов уже перепробовал.
Вот пример
var context = new Model1Container();
var parent = new Entity1();
var child = new Entity1() {Parent = parent};
parent.Parent = child;

context.Entity1Set.Add(child);
context.SaveChanges();


Факт в том, что нельзя сделать ассоциацию таблицы на саму себя и при этом создать перекрестные ссылки между 2 взаимозависимыми словами. То есть структура БД должна быть такой
id | pid | name
1 | 2 | телевизор
2 | 1 | плазма

Если это нарушает какое-то правило проектирования БД, то как реализовать подобную зависимость, без создания дополнительных таблиц?
Ответ написан
Ваш ответ на вопрос

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

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