【问题标题】:Dynamic table name EF CORE 2.2动态表名 EF CORE 2.2
【发布时间】:2019-05-21 21:06:27
【问题描述】:

我想创建一个通用的方法来处理表格。学习链接

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 中真的没有简单的方法来实现它

【问题讨论】:

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


【解决方案1】:

抱歉,您需要重新设计模型。

只要每种类型都有一个表,就可以做一些通用的事情——你可以进入配置并更改数据库表。 OpenIddict 允许这样做。您可以覆盖 DbContext 的构造函数并使用对象模型播放任何您想要的内容,包括更改表名。

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

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

您还严重错过了实际逻辑,即删除。我不想告诉你,虽然你可以在其他层上实现安全性以供阅读,但我的每一个写入/更新方法都是手写的。现在,“授权”似乎有效——但不,它没有。或者 - 如果您的应用程序是“Hello world”复杂的,它会这样做。我有时会运行几页测试代码,是否允许在特定业务上下文中进行操作,并且这是特定的,用户是否设置了覆盖开关(取决于他是谁,这可能有效也可能无效)确实绕过了某些业务规则。无论如何,所有这些都是特定的。

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

但是现在,动态覆盖表名——同时在后台保持相同的对象——会很快咬你。它可能只适用于极其简单的事情——你知道,“hello world”的例子——并且在你真正有逻辑的那一刻就崩溃了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-01
    • 2018-06-11
    • 2021-04-16
    • 2020-01-25
    • 2019-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多