Проверьте, существует ли таблица в базе данных, используя LINQ - PullRequest
5 голосов
/ 07 марта 2011

У нас есть база данных, которая была развернута для различных клиентов.В настоящее время мы вводим дополнительную новую функцию, для использования которой потребуются клиенты, которые хотят, чтобы эта функция добавила новую таблицу в существующую базу данных.

Поскольку мы внедряем новый программный продукт, который должен будет взаимодействовать с версиями базы данных как с новой таблицей, так и без нее (и, поскольку нам не нужны две версии, одна для клиентов, у которых есть новаятаблица и одна для тех, кто этого не делает) нам было интересно, возможно ли программно определить (с помощью сущности), существует ли таблица в базе данных (я могу попытаться получить доступ к таблице и вызвать ее исключение, но мне было интересно, еслибыла встроенная функция для этого)

Спасибо

Редактировать: Учитывая, что люди говорят мне, что я должен использовать файл конфигурации, не проверяя EF, может кто-нибудьдайте мне указания о том, как проверить файл конфигурации, например, с помощью пользовательских аннотаций данных для контроллера MVC.Что-то вроде:

[Boolean(Properties.Settings.Default.TableExists)]
public class NamedController : Controller

Что выбрасывает страницу, не найденную, если ложно?

Редактировать 2: С предложениями, данными людьми для использования настроек конфигурации, я закончилсо следующим решением

Настройки приложения, чтобы установить, существует ли таблица

<appSettings>
    <add key="tableExists" value="True"/>
</appSettings>

пользовательская аннотация данных, чтобы сказать, разрешить ли доступ к контроллеру

[AuthoriseIfTableExistsIsTrue]
public class NamedController : Controller

коддля пользовательской авторизации

public class AuthoriseIfTableExistsIsTrue : AuthorizeAttribute
{
    private readonly bool _tableExists;

    public AuthoriseIfTableExistsIsTrue()
    {
        _tableExists = string.Equals(bool.TrueString, ConfigurationManager.AppSettings["tableExists"], StringComparison.InvariantCultureIgnoreCase);
    }

    public AuthoriseIfTableExistsIsTrue(bool authorise)
    {
        _tableExists = authorise;
    }

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        if (_tableExists)
            return base.AuthorizeCore(httpContext);
        else
            throw new HttpException(404, "HTTP/1.1 404 Not Found");
    }
}

Спасибо всем за помощь и за то, что я не использовал EF для этого, а вместо этого использовал настройку конфигурации

Ответы [ 2 ]

7 голосов
/ 07 марта 2011

Гораздо лучшим вариантом будет сохранение различий версий в конфигурации.Это может быть сохранено в самой базе данных, в файле конфигурации или даже в файле web.config.

В противном случае вы получите грязный код, такой как:

int result = entity.ExecuteStoreQuery<int>(@"
    IF EXISTS (SELECT * FROM sys.tables WHERE name = 'TableName') 
        SELECT 1
    ELSE
        SELECT 0
    ").SingleOrDefault();
2 голосов
/ 07 марта 2011

Единственными возможными способами являются

  • Запрос к таблице и получение исключения
  • Использование собственного SQL для запроса системных представлений и поиска этой таблицы - в EFv4 вы можете выполнить запрос непосредственно из ObjectContext, вызвав ExecuteStoreQuery.

Ваша модель сущности все еще будет иметь эту таблицу, поэтому, по моему мнению, вам следует просто отправить вашу БД с этой таблицей и в дескриптор кода приложения, если функция разрешена или нет (таблица не будет использоваться, но будет в БД.)

Если вы хотите создать модульную систему, тогда вся ваша функция (включая код приложения) не должна присутствовать, когда клиент не хочет ее использовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...