У меня была такая же проблема, и я нашел две вещи:
- Соглашения, которые используются для сопоставления имен столбцов, - это имена, такие как User_UserID и User_ID, а не UserID. Решения:
- Вы можете варьировать соглашения, которые он использует. Мне не ясно, возможно ли это в EF 4.1 - у Скотта Гу есть пост, жалующийся на то, что это не так, но я могу видеть свойство Conventions, свисающее с класса ModelBuilder ... только с одним методом ... Add ( ).
- Вы можете явно указать имя внешнего ключа (см. Ниже).
- У меня были случаи, когда я действительно исправлял это в соответствии с предложениями в StackOverflow, но кэшированная DbModel означала, что он все еще оставался неработающим, пока я фактически не закрыл Cassini и не заставил веб-сервер dev полностью перезапуститься.
К сожалению, поскольку вы не используете соглашения об именах, которые предполагает фреймворк, вам придется продолжать использовать атрибут ForeignKey во всех ваших классах, чтобы все связывалось правильно, или он будет продолжать сопоставляться с неверное имя столбца.
Установка имени внешнего ключа выглядит следующим образом:
[ForeignKey("UserID")]
public virtual User User { get; set; }
Это явно указывает платформе на использование UserID вместо User_UserID
В случаях «многие ко многим» вам необходимо использовать вышеупомянутый вызов Map и применить атрибут ForeignKey с обеих сторон.
Это решило это для меня.
Теперь я понимаю, почему Скотт оплакивал отсутствие конвенций - это действительно горит, когда вы пытаетесь собрать вещи в существующую базу данных.