Как обновить модель структуры сущностей 4 с отношением «многие ко многим»? - PullRequest
1 голос
/ 18 мая 2011

У меня есть модель сущности со следующими объектами:

  • Дом
  • Задача
  • TaskType

У меня есть следующиеотношения: Дом <1> ---- <<em>> Задача (один ко многим) Задача <</em>> ---- <1> Тип задания (много к одному)

Теперь я хотелдобавить отношение многие ко многим между House и TaskType, чтобы указать, какие TaskTypes доступны для дома.

Какой правильный способ сделать это в Visual Studio 2010 без потери данных в базе данных.

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

Если я пытаюсь создать таблицу вручную в БД с именем HouseTaskTypes с двумя столбцами (House_Id и TaskType_Id) с внешними ключами для House и TaskTypes, это выглядит странно, когда я обновляюМодель из базы данных.

Могу попробоватьумело заставить его работать с некоторыми ручными корректировками, но я хотел бы знать, как правильно добавить ассоциацию / отношение «многие ко многим» в уже существующую модель Entity Framework.

Все идеиоценили!

1 Ответ

1 голос
/ 18 мая 2011

Перенос существующей схемы базы данных в новую не поддерживается в EF 4.1. От MSDN :

Code First не поддерживает миграцию существующей схемы базы данных. Entity Framework 4.1 поддерживает удаление и повторное создание базы данных схема, когда модель меняется через используя инициализаторы базы данных. поддерживаются следующие инициализаторы: CreateDatabaseIfNotExist, DropCreateDatabaseAlways и DropCreateDatabaseIfModelChanges

Итак, чтобы решить вашу проблему, я бы

  • установить для инициализатора значение CreateDatabaseIfNotExist или отключить его
  • вручную добавить таблицу в базу данных
  • добавить свойства навигации в вашу модель вручную
  • вручную сопоставить отношение «многие ко многим» (см. Ниже)
  • затем добавьте любые данные в новую таблицу либо через ваше приложение, либо вручную

Чтобы вручную отобразить отношение , добавьте следующий метод в DBContext

 class protected override void OnModelCreating(DbModelBuilder modelBuilder)
 {
    base.OnModelCreating(modelBuilder);

    modelBuilder.Configurations.Add(new HouseConfiguration());   `
 }

Затем в том же или доступном пространстве имен, что и ваш класс DBContext, добавьте класс конфигурации для одной стороны отношения «многие ко многим». Цель этого класса - сделать фактическое отображение. У меня обычно есть отдельное пространство имен только для этих классов конфигурации.

class HouseConfiguration : EntityTypeConfiguration<House>
{
    public HouseConfiguration()
    {
        // many-to-many w/tasktypes
        this.HasMany(h => h.TaskTypes)
            .WithMany(tt => tt.Houses) 
            .Map(m =>
                {
                    m.ToTable("HouseTaskTypes");
                    m.MapLeftKey("HouseId");
                    m.MapRightKey("TaskTypeId");
                });

    }
}

Вам нужно будет дважды проверить имена свойств / имена ключей, но это должно сделать это.

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