Как получить код EF 4.1 RC первым, чтобы использовать правильный внешний ключ? - PullRequest
3 голосов
/ 05 апреля 2011

Я использовал CTP5 и переключился на RC1. Без изменений в EntityTypeConfiguration EF теперь пытается найти что-то по неправильному имени столбца. Он использует единственное, а не множественное число от имени столбца, и я не могу понять, откуда взялась эта идея.

Пример: многие ко многим

//User.Roles
//Role.Users

//User EntityTypeConfiguration

this.HasKey(x => x.Id);

this.HasMany(x => x.Roles)
   .WithMany().Map(m => {
      m.MapLeftKey("Users_Id");
      m.MapRightKey("Roles_Id");
      m.ToTable("UserRoleLinks");
   });

Тогда я получаю ошибку:

Неверное имя столбца 'User_Id'.

Где он получает "User_Id"? Идентификатор таблицы "Id"; Таблица соединений явно указана как «Users_Id». Что изменилось между CTP5 и RC1, что могло бы вызвать это?

ОБНОВЛЕНИЕ:

Я использую "modelBuilder.Conventions.Remove ()", что больше не поддерживается? Может ли это быть проблемой? Я не уверен, что поведение по умолчанию сейчас.

protected override void OnModelCreating(DbModelBuilder modelBuilder) {
   modelBuilder.Conventions.Remove<IncludeMetadataConvention>();

   modelBuilder.Configurations.Add(new UserConfig()); 
}

Ответы [ 2 ]

4 голосов
/ 06 апреля 2011

Я понял, что я делаю неправильно. Короткий ответ заключается в том, что мне нужно было определить обе стороны отношения «многие ко многим», потому что каждый класс участвует в ответной коллекции (User.Roles и Role.Users). Очевидно, что это не было необходимо с CTP5.

См .: Отображение «многие ко многим» не работает - EF 4.1 RC

Чтобы придерживаться моего примера, вот правильный синтаксис.

this.HasMany(x => x.Roles)
   .WithMany(r => r.Users).Map(m => {
      m.MapLeftKey("Users_Id");
      m.MapRightKey("Roles_Id");
      m.ToTable("UserRoleLinks");
   });

Есть пара подводных камней, которые скрывают для меня простое решение.

1) Определите отношения только один раз. Я определял отношение «многие ко многим» с обеих точек зрения в разных классах EntityTypeConfiguration , что не является необходимым и приводит к собственным ошибкам.

2) Не перепутайте поля, которые вы используете для MapLeftKey и MapRightKey. Порядок интуитивно понятен, но я предполагаю, что это легко что-то, что можно перепутать с помощью копирования / вставки, а что-нет.

0 голосов
/ 06 апреля 2011

Соглашение об именах внешнего ключа изменено в EF 4.1 RC.

Проблема в основном в том, что EF теперь ожидает, что FK будет называться User_ID (в единственном числе), а RC не позволяет настраивать пользовательские соглашения..

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

Этот ответ (полученный от моего вопроса, см. Ниже) работал для меня безболезненно и без проблем в производственной базе данных.


Полезные ссылки

.
...