动态 table 名称 EF CORE 2.2
Dynamic table name EF CORE 2.2
我想创建一个通用的方法来处理 tables。研究链接
例如,SQL table 之一的 ASP.NET 核心控制器如下所示。有很多table。您必须为每个 table :
实现这样的 (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);
}
我想为所有此类操作获取一个通用方法,能够动态更改 table 的名称。理想情况下,将 table 名称设置为字符串。我知道这可以使用 SQL 插入来完成,但是在 EF CORE
中真的没有简单的方法来实现它吗
抱歉,您需要修改模型。
只要每种类型有一个 table,就可以做一些通用的事情 - 您可以进入配置并更改数据库 table。 OpenIddict 允许这样做。您可以覆盖 DbContext 的构造函数并使用对象模型随心所欲地发挥作用,其中包括更改 table 名称。
您还可以做一个通用基础 class,将您处理的 classes 作为参数。我有那些 - 采用 (a) db 实体类型和 (b) api side dto 类型,然后使用一些通用函数和 Automapper 在它们之间进行映射。
但是,当您需要动态获取 table 名称时,您就陷入了痛苦的世界。 EF 标准体系结构假定对象类型映射到数据库实体。因此,ID 在 table 中是唯一的——整个关系模型都依赖于此。 ID 44 必须是唯一的,对于一个特定的对象,而不是对于一个对象和 table 它在此刻从中加载。
您还严重遗漏了实际逻辑,即删除。我不想告诉你,虽然你可以在其他层上实施安全性以供阅读,但我的每个 write/update 方法都是手写的。现在,似乎 "Authorize" 有效 - 但不,它没有。或者 - 如果您的应用程序 "Hello world" 复杂,它就会这样做。我 运行 有时测试代码的页面是否允许在特定的业务上下文中进行操作并且这是特定的,用户是否设置了覆盖开关(这可能有效也可能无效取决于他是谁)做绕过一定的业务规则。所有这一切都是具体的。
哦,你还可以做什么...因为你似乎有很多 tables:不要使用一个 class,生成它们。脚手架没有那么复杂。我几乎不记得我什么时候生成了最后一个 EF 核心数据库 classes - 现在它们都来自 Entity Developer(来自 Devart 的工具),而数据库是用更改脚本处理的(我首先工作数据库 - 我实际上想要使用数据库,这意味着过滤索引、触发器、一些 sp 和具有特定 SQL) 的视图,因此迁移根本不起作用。
但是现在,动态覆盖 table 名称 - 同时在后台保留相同的对象 - 会很快咬住你。它可能只适用于极其简单的事情 - 你知道,"hello world" 示例 - 并在你真正有逻辑的那一刻分开。
我想创建一个通用的方法来处理 tables。研究链接
例如,SQL table 之一的 ASP.NET 核心控制器如下所示。有很多table。您必须为每个 table :
实现这样的 (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);
}
我想为所有此类操作获取一个通用方法,能够动态更改 table 的名称。理想情况下,将 table 名称设置为字符串。我知道这可以使用 SQL 插入来完成,但是在 EF CORE
中真的没有简单的方法来实现它吗抱歉,您需要修改模型。
只要每种类型有一个 table,就可以做一些通用的事情 - 您可以进入配置并更改数据库 table。 OpenIddict 允许这样做。您可以覆盖 DbContext 的构造函数并使用对象模型随心所欲地发挥作用,其中包括更改 table 名称。
您还可以做一个通用基础 class,将您处理的 classes 作为参数。我有那些 - 采用 (a) db 实体类型和 (b) api side dto 类型,然后使用一些通用函数和 Automapper 在它们之间进行映射。
但是,当您需要动态获取 table 名称时,您就陷入了痛苦的世界。 EF 标准体系结构假定对象类型映射到数据库实体。因此,ID 在 table 中是唯一的——整个关系模型都依赖于此。 ID 44 必须是唯一的,对于一个特定的对象,而不是对于一个对象和 table 它在此刻从中加载。
您还严重遗漏了实际逻辑,即删除。我不想告诉你,虽然你可以在其他层上实施安全性以供阅读,但我的每个 write/update 方法都是手写的。现在,似乎 "Authorize" 有效 - 但不,它没有。或者 - 如果您的应用程序 "Hello world" 复杂,它就会这样做。我 运行 有时测试代码的页面是否允许在特定的业务上下文中进行操作并且这是特定的,用户是否设置了覆盖开关(这可能有效也可能无效取决于他是谁)做绕过一定的业务规则。所有这一切都是具体的。
哦,你还可以做什么...因为你似乎有很多 tables:不要使用一个 class,生成它们。脚手架没有那么复杂。我几乎不记得我什么时候生成了最后一个 EF 核心数据库 classes - 现在它们都来自 Entity Developer(来自 Devart 的工具),而数据库是用更改脚本处理的(我首先工作数据库 - 我实际上想要使用数据库,这意味着过滤索引、触发器、一些 sp 和具有特定 SQL) 的视图,因此迁移根本不起作用。
但是现在,动态覆盖 table 名称 - 同时在后台保留相同的对象 - 会很快咬住你。它可能只适用于极其简单的事情 - 你知道,"hello world" 示例 - 并在你真正有逻辑的那一刻分开。