Я сузил это до некоторой проблемы между Code First и Database first EF, но я не уверен, как это исправить. Я постараюсь быть как можно более ясным, но, честно говоря, мне сам не хватает некоторого понимания. Это Entity Framework 4.4
Я унаследовал проект, в котором использовалась Entity Framework, но многие фактические файлы были удалены без возможности вернуться назад. Я повторно добавил EF (сначала базу данных) и реплицировал настройку T4, вокруг которой был построен проект. Он сгенерировал версии кода всех моделей баз данных и файл кода DBContext.
Если моя строка подключения выглядит как «обычная» строка подключения .NET, я получаю сообщение об ошибке о недопустимом столбце Имя «ProcessState_ID» не существует. ProcessState_ID вообще отсутствует в базе кода, его нет в файле EDMX или в чем-то еще. Это похоже на автоматическое преобразование EF в запросе.
Когда я заставляю строку подключения соответствовать модели Entity Framework, она работает нормально.
Теперь, пытаясь сопоставить предыдущий код с Entity Framework, я хотел бы сохранить «обычную» строку подключения .NET.
Итак, у меня есть два вопроса: 1. Как лучше всего перейти от обычной строки подключения к строке подключения EF в коде? 2. Есть ли еще одно исправление, которое я не вижу, чтобы остановить ошибку недопустимого имени столбца?
источник
public virtual Person Person { get; }
Ответы:
Проверьте, есть ли у вас ICollections.
Я выяснил, что когда у вас есть ICollection, который ссылается на таблицу, и нет столбца, который он может определить, он создает один, чтобы вы попытались установить связь между таблицами. В частности, это происходит с ICollection и заставляет меня «бить», пытаясь понять это.
источник
Это поздняя запись для тех (вроде меня), которые не сразу поняли два других ответа.
Так...
EF пытается сопоставить ОЖИДАЕМУЮ имя из РОДИТЕЛЬСКИХ ТАБЛИЦ KEY-REFERENCE ... и поскольку ... имя FOREIGN KEY было "изменено или сокращено" в отношениях CHILD TABLE баз данных ... вы получите сообщение выше.
(это исправление может отличаться в зависимости от версии EF)
ДЛЯ МЕНЯ ИСПРАВЛЕНИЕМ БЫЛО:
ДОБАВЛЕНИЕ атрибута "ForeignKey" в модель.
источник
Category_Id
. Вы упомянули об исправлениях для разных версий EF, верно? Я использую EF 6.0. Какое исправление я могу принять?*_ID
. В том числе обратная ссылка работала нормально.[MetadataType(typeof(MetaData))] public partial class Tour { public class MetaData { [ForeignKey(nameof(TourCategory))] public virtual TourCategory TourCategory { get; set; } } }
Святая корова - после многих часов попыток я наконец понял это.
Сначала я делаю базу данных EF6, и мне было интересно узнать об ошибке «неизвестный столбец степени» - по какой-то причине она генерировала имя столбца подчеркивания имени таблицы и пыталась найти несуществующий столбец.
В моем случае в одной из моих таблиц было две ссылки внешнего ключа на один и тот же первичный ключ в другой таблице - примерно так:
EF производило некоторое странное имя столбца , как
Owners_AnimalID1
иOwners_AnimalID2
затем продолжил ломать себя.Уловка здесь в том, что эти запутанные внешние ключи необходимо зарегистрировать в EF с помощью Fluent API!
В контексте основной базы данных переопределите
OnModelCreating
метод и измените конфигурацию объекта. Желательно, чтобы у вас был отдельный файл, расширяющийEntityConfiguration
класс, но вы можете сделать это встроенным.В любом случае вам нужно будет добавить что-то вроде этого:
И с этим EF (возможно) начнет работать так, как вы ожидаете. Бум.
Кроме того, вы получите ту же ошибку, если используете указанное выше со столбцом, допускающим значение NULL - просто используйте
.HasOptional()
вместо.HasRequired()
.Вот ссылка, которая меня сбила с толку:
https://social.msdn.microsoft.com/Forums/en-US/862abdae-b63f-45f5-8a6c-0bdd6eeabfdb/getting-sqlexception-invalid-column-name-userid-from-ef4-codeonly?forum=adonetefx
И тогда вам помогут документы Fluent API, особенно примеры внешних ключей:
http://msdn.microsoft.com/en-us/data/jj591620.aspx
Вы также можете поместить конфигурации на другой конец ключа, как описано здесь:
http://www.entityframeworktutorial.net/code-first/configure-one-to-many-relationship-in-code-first.aspx .
Сейчас я сталкиваюсь с некоторыми новыми проблемами, но это был огромный концептуальный пробел, которого не хватало. Надеюсь, поможет!
источник
builder.HasOne(item => item.LogicalShipment).WithMany(s => s.Items).HasForeignKey(item => item.LogicalShipmentId).IsRequired();
Предположения:
Table
OtherTable
OtherTable_ID
Теперь выберите один из следующих способов:
А)
удалять
ICollection<Table>
Если у вас есть какая-то ошибка, связанная с
OtherTable_ID
получениемTable
, перейдите к своейOtherTable
модели и убедитесь, что у васICollection<Table>
там нет. Без определения отношения платформа автоматически предполагает, что у вас должен быть FK для OtherTable, и создает эти дополнительные свойства в сгенерированном SQL.Б)
OtherTableId
вTable
и
OtherTableId
вTable
базе данных висточник
В моем случае я неправильно определял первичный ключ, состоящий из двух внешних ключей, например:
Ошибка, которую я получал, была «недопустимое имя столбца Bar_ID».
Указание составного первичного ключа правильно устранило проблему:
источник
Для меня причиной такого поведения была проблема с определенным сопоставлением с Fluent API. У меня было 2 связанных типа, где тип A имел необязательный объект типа B, а тип B имел много объектов A.
Я определил отображение с помощью свободного API следующим образом:
Но проблема заключалась в том, что этот тип B имел свойство навигации
List<A>
, поэтому в результате у меня былоSQLException Invalid column name A_Id
Я прикрепил Visual Studio Debug к EF DatabaseContext.Database.Log для вывода сгенерированного SQL в VS Output-> Окно отладки
И сгенерированный SQL имел 2 отношения из таблицы B -> одно с правильным идентификатором, а другое с
A_Id
Проблема заключалась в том, что я не добавил это
B.List<A>
свойство навигации в отображение.Вот как в моем случае должно было быть правильное отображение:
источник
В моем случае причиной этой проблемы было отсутствие ограничения FOREIGN KEY в перенесенной базе данных. Таким образом, существующая виртуальная коллекция ICollection не была загружена успешно.
источник
У меня тоже была эта проблема, и кажется, что есть несколько разных причин. Для меня это было свойство id, ошибочно определенное как int вместо long в родительском классе, содержащем объект навигации. Поле id в базе данных было определено как bigint, что соответствует long в C #. Это не вызвало ошибки времени компиляции, но вызвало ту же ошибку времени выполнения, что и OP:
источник
Для меня проблема в том, что таблица была отображена в моем приложении дважды - один раз через Code First, второй раз через Database First.
Удаление любого из них решает проблему в моем случае.
источник
Для меня это произошло из-за проблем с множественным числом EF. Для таблиц, которые заканчиваются чем-то вроде «-Status», EF считает, что это единственное число «-Statu». Изменение имени сущности и таблицы БД на "-StatusTypes" исправило это.
Таким образом, вам не нужно будет переименовывать модели сущностей каждый раз при их обновлении.
источник
Если у вас есть ссылки внешнего ключа на одну и ту же таблицу более одного раза, вы можете использовать InverseProperty
Что-то вроде этого-
источник
Для меня (с использованием Visual Studio 2017 и модели «сначала база данных» в Entity Framework 6.1.3) проблема исчезла после перезапуска Visual Studio и перестройки.
источник
В моем случае данные моего начального метода по-прежнему вызывали столбец таблицы, который был удален при предыдущей миграции. Дважды проверьте свои сопоставления, если вы используете Automapper.
источник
В моем случае у меня уже есть база данных (первая база данных). Благодаря всем комментариям я нашел свое решение:
Таблицы должны иметь взаимосвязь, но имена столбцов должны быть разными и содержать атрибут ForeignKey.
[ForeignKey ("PrestadorId")] общедоступный виртуальный AwmPrestadoresServicios Colaboradores {получить; устанавливать; }
То есть PRE_ID - это PK, но FK в другой таблице - PRESTADOR_ID, тогда он работает. Благодаря всем комментариям здесь я нашел свое решение. EF работает загадочным образом.
источник
Если у вас возникла проблема со свойством навигации в той же таблице, вам придется изменить имя нашего свойства.
Например :
Вы должны изменить
AncestorId
дляPersonId
.Похоже, EF пытается создать ключ
ParentId
потому что не может найти таблицу с именем Ancestor ...РЕДАКТИРОВАТЬ: это сначала исправление для базы данных!
источник