根据ef中的另一个字段值更新一个字段值

本文关键字:字段 一个 更新 另一个 ef 根据 | 更新日期: 2023-09-27 18:12:41

如何根据实体框架镜像中的另一个字段值更改字段值?

我有一个名为Tbl_Accounts的表,包含以下列:

  1. ID (int)
  2. 代码(nvarchar (50))
  3. 名称(nvarchar (50))
  4. ParentID (int: nullable) ----->这是类型为Account(树结构)的父ID

在我的程序的旧版本中,'Code'列有一个3长度的数字值,
例如,我在下面列出了存储在Tbl_Account中的一些数据:

  • 1,‘100’,‘Parent1’,空
  • 2,‘200’,‘Parent2"……,空
  • 3,‘300’,‘Parent3’,空
  • 4,'001','第一个孩子',1
  • 5,'002',' second Child OF parents ',1
  • 6,'001','第一个孩子的第一个孩子的父母',4
  • 7,'001','第一个孩子的第二个孩子的父母',5

现在:我想改变代码的值如下根据它的父迁移:

  • 1, '100','Parent1',null
  • 2, '200','Parent2',null
  • 3, '300','Parent3',null
  • 4, '100001','父母的第一个孩子',1
  • 5,'100002','第二胎',1
  • 6,'100001001','父母第一个孩子的第一个孩子',4
  • 7,'100002001','第一个孩子的第二个孩子的父母',5

备注:Record with ID=7的代码值:

  • 100002: ID=5记录中代码列的值
  • 001: ID=7记录中代码列的实际值

ID=5的记录的码值:

  • 100: ID=1的记录中代码列的值
  • 002: ID=5
  • 记录中代码列的实际值

根据ef中的另一个字段值更新一个字段值

如果您想在迁移中这样做,您可以使用raw sql。

Sql(假设你正在使用Sql Server)看起来像这样(你需要一个递归的CTE,因为更新的值可能依赖于"先前"更新的值)

WITH cte 
AS
(
    SELECT id, code
    FROM Tbl_Accounts
    WHERE parent_id IS NULL
    UNION ALL
    SELECT u.id, d.code + u.code
    FROM Tbl_Accounts AS u
    INNER JOIN cte AS d
        ON d.id = u.parent_id
)
update t
set t.code = c.code
from cte c
join Tbl_Accounts t on t.id = c.id

如果您使用Code优先迁移,您可以将其作为字符串变量,并且只需执行(在up方法中)

Sql(<yourStringVariableContainingTheSql);

顺便说一下,您也可以直接在基库中执行此查询。

查看sqlFiddle以确定结果