Неверное имя объекта 'dbo.TableName' при извлечении данных из сгенерированной таблицы

Сначала я использую код структуры сущностей для создания своих таблиц. Пожалуйста, обратите внимание - создавайте таблицы, а не БД, так как я работаю в размещенной среде, и у меня нет пользователя, которому разрешено создавать БД.

Фиксация обновления БД работает нормально, но получение данных дает исключение:

Exception Details: System.Data.SqlClient.SqlException: Invalid object name 'dbo.EventHosts'.

Я прочитал, что это происходит потому, что я не использую EF Code First для создания БД. Это хорошо, но как мне элегантно решить эту проблему?

Все сгенерированные таблицы не имеют префикса типа dbo. Такое решение не работает и совсем не элегантно:

<code>[Table("EventHosts", Schema = "")]
</code>
 Ladislav Mrnka07 мая 2012 г., 11:34
@ JamesManning: Это не относится к хост-среде, где у вас почти всегда есть отдельная схема для ваших таблиц.
 Ladislav Mrnka06 мая 2012 г., 22:36
Префикс на самом деле является схемой, а dbo - по умолчанию. Какая схема по умолчанию для вашей базы данных? Вы должны будете использовать эту схему в отображении.
 Jochen van Wylick06 мая 2012 г., 22:26
Hi - извините за непонятность - это MS SQL и выполняемый запрос SELECT что-то из dbo.EventhHosts. Что, очевидно, неправильно, потому что имя таблицы только EventHosts. Поэтому я должен убедиться, что Entity Framework не устанавливает dbo. перед именем таблицы, или таблицы должны быть сгенерированы с префиксом.
 James Manning07 мая 2012 г., 01:48
Можете ли вы просто переместить таблицы в схему dbo? Это схема по умолчанию, и если нет веской причины использовать другие схемы, вам будет проще просто оставить все в схеме dbo. Смотрите эту связанную тему SO: / Stackoverflow.com вопросы / 9562883 / ...
 Jochen van Wylick06 мая 2012 г., 22:56
@ LadislavMrnka - Спасибо! Итак, я сделал следующее: - Я запустил exec sp_columns EventHosts (в Visual Studio) - Получил имя из столбца TABLE_OWNER - Использовал это в атрибуте [Table ("EventHosts", Schema = "TABLE_OWNER_HERE")] на объекте, который решает проблема. Если у кого-то есть идея, как я могу установить это для всех сущностей с одной строкой - в отличие от добавления этого атрибута ко всем сущностям - пожалуйста, дайте мне знать.

Ответы на вопрос(5)

для меня проблема была в том, что у меня был стол с именемdbo.UserState и в коде C # EF Code First пытался получить доступdbo.UserStates (из-за плюрализации). Решение было поставитьTable атрибут над классом и укажите точное имя таблицы:

[Table("UserState")]
public class UserState
{
    [Key]
    public int UserId { get; set; }
}
Решение Вопроса

используйте схему, созданную для вас вашим хостинг-провайдером.

Чтобы ответить на ваш второй вопрос: Нет, в настоящее время нет прямого способа изменить схему по умолчанию глобально, потому что вы не можете изменять существующие соглашения или создавать новые соглашения. Вы можете попытаться взломать его.

Например, вы можете переопределитьOnModelCreating и использовать отражение, чтобы получить всеDbSet<> свойства объявлены в вашем контексте. Чем вы можете просто использовать простой цикл для этих свойств и создатьToTable сопоставление вызова с именем свойства в качестве имени таблицы и вашей пользовательской схемы. Чтобы это сработало, потребуется немного поразмышлять.

В качестве альтернативы вы можете попытаться использовать подход, который можно использовать повторно, применяя пользовательские соглашения. Вы можете найти много разных статей об использовании ваших собственных соглашений с EF. Некоторые примеры

Пользовательские соглашения в Entity Framework Code First v 4.1 Соглашения в Entity Framework 4.1 Final

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

 Arjun Vachhani20 янв. 2015 г., 12:39
У меня похожая проблема с MySql. Если возможно, пожалуйста, посмотрите на / Stackoverflow.com вопросы / 28044340 / ...

https: //stackoverflow.com/a/12808316/306927

У меня была та же проблема, это была проблема множественности между отображением и БД.

EventHosts" может не существовать или эта таблица переименована в другое имя, пожалуйста, проверьте это ..

 CaptainBli07 нояб. 2014 г., 14:54
Это скорее комментарий, а не ответ. Если вы можете предоставить более подробную информацию, это поможет.
 SimonGates15 нояб. 2012 г., 12:15
А как насчет баз данных с несколькими именами схем?
 Eray Aydogdu03 дек. 2012 г., 16:34
в этом случае нет нескольких имен схем

Ваш ответ на вопрос