EF: как мне моделировать 1: 1 без ссылочной целостности БД?

#c# #entity-framework

#c# #entity-framework

Вопрос:

Рассмотрим следующие таблицы:

 Base, Primary key: Id
Extension, Primary key: Id
  

Первичный ключ в таблице «Extension» имеет то же значение, что и первичный ключ в таблице «Base». Я хочу смоделировать это в edmx как таковой:

База может иметь 0 .. 1 (Ноль или один) экземпляров расширения.

Расширение может иметь 1 (один) экземпляр Base. Используйте расширение.База для доступа к базовому экземпляру.

Когда я пытаюсь указать детали сопоставления для этой ассоциации, я получаю ошибку, подобную этой:

«Ошибка 3021: Проблема с отображением фрагментов, начинающихся со строки xx: каждый из следующих столбцов в таблице Base сопоставлен нескольким свойствам концептуальной стороны: Base.Идентификатор сопоставляется с «

Как я могу смоделировать связь 1: 0 .. 1, которая не поддерживается связью с базой данных? Мне в принципе нужна связь, чтобы я мог запрашивать свою модель чтения с помощью Linq.

Комментарии:

1. Entity framework сильно зависит от уровня базы данных, поэтому, чтобы это сработало, вы должны добавить отношение к базе данных. Должно быть возможно достичь этого в EF без изменений базы данных, но это работает только иногда — особенно если вы пытаетесь также изменить данные.

Ответ №1:

Если я правильно вас понял, то вы делаете что-то похожее на проблему, которую мне пришлось решать слишком долго назад в системе обмена сообщениями.

По сути, я создал промежуточную таблицу с двумя столбцами в обоих целых числах, в одном содержался идентификатор из одной таблицы, а в другом — идентификатор из другой таблицы, что затем позволило мне соединить их вместе.

итак, НАПРИМЕР:

 --------------------------
| Base ID | Extension ID |
--------------------------
  

Однако мне пришлось управлять таблицей вручную, так что потребовалось немного дополнительной работы, но это сделало свое дело.

Возможно, это не та схема, которая вам нужна, но я думаю, что промежуточная таблица, независимо от вашей схемы, является разумным способом удовлетворения ваших потребностей.

Комментарии:

1. Это работало без ссылочной целостности в базе данных? И как вы смоделировали это в edmx?

2. Да, конечно, сделал. Я вручную создал таблицу в своей БД и сам добавил ссылки FK, затем я просто указал EF на нее и сказал ей создать модель. Поскольку в дизайне нет ничего особенного, у вас не должно возникнуть проблем с тем, чтобы сначала выполнить код или сначала модель.

Ответ №2:

Вы должны изменить свои классы режимов следующим образом для отношения 1: 1 :-

Базовый класс

 public class Base
{
    public int BaseID;
    public int ExtentionID;
    public virtual Extention Extension { get; set; }
}
  

Класс расширения

 public class Extention
{
    public int ExtentionID;
    public int BaseID;
    public Base Base { get; set; }
}
  

Комментарии:

1. Мы генерируем POCO из edmx, используя шаблон t4, поэтому меня больше интересует, как это будет выглядеть в вашем файле edmx.

2. о, черт… Я подумал, что это может вам понравиться. Поскольку это действительно отличный способ работы с таблицами и моделями. В любом случае, извините за неуместный ответ с моей стороны.

3. Я не говорю, что ваш пост не имеет значения, я просто говорю, что он очень короткий 🙂