动态表名称EF CORE 2.2

时间:2018-12-21 11:25:39

标签: c# linq entity-framework-core asp.net-core-2.1

我想为使用表提供一种通用方法。研究链接

Dynamically Instantiate Model object in Entity Framework DB first by passing type as parameter

Dynamically access table in EF Core 2.0

作为示例,下面显示了其中一个SQL表的ASP.NET CORE控制器。有很多桌子。您必须为每个表实现这样的(DEL,ADD,CHANGE)方法:

    [Authorize(Roles = "Administrator")]
    [HttpPost]
    public ActionResult DeleteToDB(string id)
    {
        webtm_mng_16Context db = new webtm_mng_16Context();

        var Obj_item1 = (from o1 in db.IT_bar 
                         where o1.id == int.Parse(id)
                         select o1).SingleOrDefault();
        if ((Obj_item1 != null))
        {
            db.IT_bar.Remove(Obj_item1);
            db.SaveChanges();
        }
        var Result = "ok";

        return Json(Result);

    }

我想为所有此类操作获取通用方法,并具有动态更改表名的能力。理想情况下,将表名称设置为字符串。我知道可以使用SQL插入来完成此操作,但实际上没有简单的方法可以在EF CORE中实现该功能

1 个答案:

答案 0 :(得分:1)

对不起,但是您需要重新设计模型。

只要每种类型都有一个表,就可以做一些通用的事情-您可以进入配置并更改数据库表。 OpenIddict允许这样做。您可以覆盖DbContext的构造函数,然后使用对象模型进行任何操作,其中包括更改表名。

您还可以做一个将您要处理的类作为参数的通用基类。我有这些-采用(a)数据库实体类型和(b)api端dto类型,然后使用一些通用函数和Automapper在它们之间进行映射。

但是,当您需要动态获取表名的那一刻时,您将陷入痛苦的世界。 EF标准体系结构假定将对象类型映射到数据库实体。这样,一个ID在表中是唯一的-整个关系模型取决于此。对于特定的对象,Id 44必须是唯一的,对于此刻加载的对象和表,必须是唯一的。

您还严重错过了手动逻辑,即删除逻辑。我不愿告诉您,但是尽管您可以在其他层上实现安全性以进行读取,但是我的每个write / update方法都是手写的。现在,似乎“授权”有效-但不,无效。或者-如果您的应用程序是“ Hello world”复杂程序,则可以。我有时会运行测试代码页面,这些操作代码是否在特定的业务环境中允许操作,并且是否特定于此,是否用户设置了覆盖开关(取决于他/她是谁而有效)是否会绕过某些业务规则。所有这些都是特定的。

哦,您也可以做......因为您似乎有很多表:不要使用一个类,而要生成它们。脚手架并不那么复杂。我几乎不记得当我确实生成了最后一个EF核心数据库类时-如今它们全都来自Entity Developer(Devart的工具),而db是用更改脚本处理的(我首先使用db-我实际上是想使用数据库和这意味着要过滤索引,触发器,带有特定SQL的sp和视图),因此迁移根本无法实现。

但是现在,动态覆盖表名-同时在后台保留相同的对象-会很快咬你。它可能仅适用于极其简单的事情(例如“ hello world”示例),并且在您实际拥有逻辑的那一刻就会中断。