Вопрос по c#, sql-server, .net, entity-framework – Неверное имя объекта 'dbo.TableName' при извлечении данных из сгенерированной таблицы

3

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

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

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

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

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

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

Ваш Ответ

5   ответов
2

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

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

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

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

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

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

У меня похожая проблема с MySql. Если возможно, пожалуйста, посмотрите на / Stackoverflow.com вопросы / 28044340 / ... Arjun Vachhani
0
А как насчет баз данных с несколькими именами схем? SimonGates
в этом случае нет нескольких имен схем Eray Aydogdu
0

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

Это скорее комментарий, а не ответ. Если вы можете предоставить более подробную информацию, это поможет. CaptainBli
0

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

[Table("UserState")]
public class UserState
{
    [Key]
    public int UserId { get; set; }
}
0

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

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

Похожие вопросы