Entity Framework проверяет, существует ли столбец во время OnModelCreating - PullRequest
0 голосов
/ 19 марта 2020

Я поддерживаю это приложение (A), которое пишет в таблицу другого приложения (B). Проблема в том, что A пишет во многие B и что модели изменились в более новых версиях B.

Пример: A имеет сущность Dog со столбцами: имя, возраст, пол
В большинстве случаев B этот объект соответствует таблице. Но самая новая версия B Dog имеет столбцы: Имя, Возраст, Пол, FavoritFood (который не допускает нулевые значения)

Я не могу изменить схему базы данных B, ни из кода, ни с сервера sql , Если я сделаю это, B просто переделает его под свои нужды. Я могу изменить сущность Dog в A, но для этого потребуется различие между более новыми и более старыми версиями B.

A использует Entity Framework 6.2 в качестве ORM.

До сих пор моя идея заключалась в следующем: Проверьте, существует ли столбец, если не игнорируйте поле.

protected override void OnModelCreating(DbModelBuilder builder) {
    base.OnModelCreating(builder);
    if (!Database.CompatibleWithModel(true)) {
        builder.Entity<Dog>().Ignore(_ => _.FavoritFood);
    }
}

Я не только не могу получить доступ к контексту из OnModelCreating. Я также считаю, что этой возможности не хватает, поскольку она очень общая c и Я хотел бы проверить специально для столбца FavoritFood.

Как я могу выполнить sh это?

Ответы [ 2 ]

0 голосов
/ 19 марта 2020

Для всех, кто сталкивается с этим: я закончил тем, что расширил комментарий @ trashr0x

protected override void OnModelCreating(DbModelBuilder builder) 
{
    base.OnModelCreating(builder);
    var exists = CheckIfColumnOnTableExists("Dog", "FavoritFood");
    if(!exists)
        builder.Entity<Dog>().Ignore(_ => _.FavoritFood);
}


private bool CheckIfColumnOnTableExists(string table, string column) {
    using (var context = new DbContext(this.Database.Connection.ConnectionString)) 
    {
        var result = context.Database.SqlQuery<int>($@"SELECT Count(*)
            FROM INFORMATION_SCHEMA.COLUMNS
            WHERE TABLE_NAME = '{table}'
            AND COLUMN_NAME = '{column}'").Single();
        return result == 1;
    }
}

Кажется, он работает последовательно, если у кого-то есть другой способ, дайте мне знать:)

0 голосов
/ 19 марта 2020

Вы можете найти его с помощью кода ниже

var property = typeof(T).GetProperty("FieldName");
  • T => ваш класс
  • FieldName => имя столбца, который вы хотите проверить

    if(property == null) //Column not exist else //Column exist

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