Удаление из таблиц - PullRequest
       8

Удаление из таблиц

0 голосов
/ 08 октября 2018

У меня есть старое консольное приложение C #, которое я сейчас обновляю, чтобы сначала использовать код Entity Framework (последняя версия).

У меня есть 20+ таблиц, которые будут созданы в базе данных.

Один из моих методов -

static void DeleteModelInDb(Model pdModel, ExporterContext db) {
    string[] tables = new string[] { "PD_COLUMN", "PD_COLUMN_EXTENDED", "PD_COLUMNRULE", "PD_COLUMNSOURCE", "PD_DB_PACKAGE", "PD_DB_PACKAGE_PROC_PARAMETER", "PD_DB_PACKAGE_PROCEDURE", "PD_DB_PACKAGE_TYPE", "PD_DB_PACKAGE_VARIABLE", "PD_DIAGRAM", "PD_DIAGRAM_TABLE", "PD_DOMAIN", "PD_DOMAIN_VALUES", "PD_INDEX", "PD_INDEX_COLUMN", "PD_JOIN", "PD_MODEL", "PD_MODEL_EXTENDED", "PD_MODEL_CHANGES", "PD_MODELSOURCE", "PD_PACKAGE", "PD_REFERENCE", "PD_RULE", "PD_TABLE", "PD_TABLE_EXTENDED", "PD_TABLE_CHANGES", "PD_TABLE_KEY", "PD_TABLE_KEY_COLUMN", "PD_TABLESOURCE", "PD_VIEW", "PD_VIEWCOLUMN", "PD_VIEWSOURCE" };

    SqlConnection con = new SqlConnection("definition of con...");
    con.Open();
    SqlCommand com = con.CreateCommand();
    foreach (string table in tables)
    {
        com.CommandText = "DELETE FROM " + table + " WHERE MODEL_CODE = '" + pdModel.Code + "'";
        com.ExecuteNonQuery();
    }
    com.Dispose();
}

Я хотел бы сделать что-то подобное, используя Entity Framework.Но я не хочу писать этот код удаления для каждой таблицы.

var x = (from y in db.PdColumn
         where y.ModelCode == pdModel.Code
         select y).FirstOrDefault();
db.PdColumn.Remove(x);
db.SaveChanges();

Может кто-нибудь помочь?

1 Ответ

0 голосов
/ 08 октября 2018

У вас должна быть возможность абстрагироваться от кода удаления, если все соответствующие объекты реализуют интерфейс со свойством ModelCode, а затем сделайте общий метод удаления (я предполагаю, что ModelCode имеет строку типа ниже):

interface IEntityWithCode {
   string ModelCode {get;}
}

void DeleteFromDbSet<T>(DBSet<T> dbset, string modelcode) where T: IEntityWithCode {
  var x = (from y in dbset
           where y.ModelCode == modelcode
           select y).FirstOrDefault();
  dbset.Remove(x);
}

Поскольку C # не поддерживает дисперсию для классов, я не думаю, что в вашем новом методе DeleteModelInDb можно зацикливаться на списке dbsets, не прибегая к неприятным способам отражения, поэтому он должен выглядеть примерно так:this

void DeleteModelInDb(YourDbContext context, string modelcode) {
  DeleteFromDbSet(context.SomeTable, modelcode);
  DeleteFromDbSet(context.SomeOtherTable, modelcode);
  //and so on
}

(Отказ от ответственности: код не тестируется, так как у меня нет удобного банкомата для настройки ядра EF)

...