首页 > 解决方案 > 从表中删除

问题描述

我有一个旧的 C# 控制台应用程序,我目前正在升级它以首先使用实体​​框架(最新版本)代码。

我将在数据库中创建 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();
}

我想使用实体框架做这样的事情。但是我不想为每个表都写这个删除代码。

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

有人可以帮忙吗?

标签: c#entity-frameworkconsole-application

解决方案


您应该能够通过让所有相关实体实现具有 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 方法中对一个数据库集列表进行循环而不诉诸讨厌的反射黑客,所以它必须看起来像这样

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

(免责声明:代码未经测试,因为我没有 EF 核心设置方便的 ATM)


推荐阅读