Как подготовить базу данных для генерации EF-модели из нее

#sql-server #entity-framework #entity-framework-designer

#sql-сервер #entity-framework #entity-framework-designer

Вопрос:

У меня есть некоторое недопонимание того, как мои объекты должны быть представлены в реляционной структуре БД.

Например, если у меня есть простая структура таблиц, которая выглядит следующим образом:

введите описание изображения здесь

И если я создам модель Entity Framework на основе этого, это будет выглядеть как:

введите описание изображения здесь

Как вы можете видеть, это ассоциация «многие ко многим». (Любое блюдо содержит много ингредиентов, любой ингредиент можно использовать во многих блюдах)

Теперь, что, если мне понадобятся какие-то дополнительные параметры, например, количество ингредиента в блюде? (Конечно, обычно это было бы отдельное число для каждого ингредиента в любом другом блюде).

Если я добавлю несколько дополнительных столбцов непосредственно в Dish_FooIngridient таблицу, это нарушит удобство автоматической генерации модели, и тогда мне придется исправлять ассоциации вручную в EF model designer, а позже использовать некоторые громоздкие запросы для работы с объектами. Потому что она будет сгенерирована во что-то вроде этого:

введите описание изображения здесь

Как вы можете видеть, теперь есть другие избыточные свойства, которые мне не нужны. Есть ли лучший способ управлять этим? Может быть, используя сложные свойства или унаследованный объект, или что-то еще?

Ответ №1:

Как предлагается в «Рецептах Entity Framework 4.0 от Apress», проектирование отношений «Многие ко многим» без полезной нагрузки не очень хорошая практика.

К сожалению, проект, который начинается с нескольких отношений «многие ко многим» без полезной нагрузки, часто заканчивается несколькими отношениями «многие ко многим», богатыми полезной нагрузкой. Рефакторинг модели, особенно в конце цикла разработки, для размещения полезных нагрузок в отношениях «многие ко многим» может быть утомительным. Вводятся не только дополнительные объекты, но также изменяются запросы и шаблоны навигации через отношения. Некоторые разработчики утверждают, что каждое отношение «многие ко многим» должно начинаться с некоторой полезной нагрузки, обычно синтетического ключа, поэтому неизбежное добавление дополнительной полезной нагрузки оказывает значительно меньшее влияние на проект. Итак, вот наилучшая практика. Если у вас отношение «многие ко многим» без полезной нагрузки и вы считаете, что существует некоторая вероятность того, что со временем оно может измениться и включить полезную нагрузку, начните с дополнительного столбца identity в таблице link. Когда вы импортируете таблицы в свою модель, вы получите два отношения «один ко многим», что означает, что написанный вами код и имеющаяся у вас модель будут готовы к любому количеству дополнительных столбцов полезной нагрузки, которые появятся по мере развития проекта. Стоимость дополнительного столбца целочисленных идентификаторов обычно является довольно небольшой платой за то, чтобы сделать модель более гибкой.

Ответ №2:

Я не понимаю, почему. Добавьте поля в Dish_FoodIngredient и присвоите ему первичный ключ. Добавьте эту таблицу в свою модель и все. Возможно, вам нужно провести некоторый рефакторинг в вашем коде, но не вините EF за это.

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

1. Это добавит третью сущность и некоторые избыточные свойства.

Ответ №3:

Дважды щелкните файл Model.edmx, затем в пустом месте рядом с вашими объектами щелкните правой кнопкой мыши и выберите «Обновить модель из базы данных …», затем нажмите Готово, и это обновит ваши таблицы.

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

1. Внимательно прочитайте вопрос… Я не спрашиваю, КАК обновить модель

2. «Если я добавлю несколько дополнительных столбцов непосредственно в таблицу Dish_FooIngridient, это нарушит удобство автоматической генерации модели, и тогда мне придется исправлять ассоциации вручную в EF model designer, а позже использовать некоторые громоздкие запросы для работы с объектами». Итак, вы хотите добавить новые столбцы в таблицу в вашей базе данных, но не обновлять вашу модель в соответствии с вашими изменениями? Обновление из EF добавит все изменения, включая ассоциации.

3. Я обновил вопрос и добавил другую картинку, надеюсь, это лучше объяснит проблему

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

5. тогда как и где я должен хранить количество ингредиента?