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

时间:2014-07-11 12:55:10

标签: c# entity-framework

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

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

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

    在我的程序的旧版本中,“代码”列有一个3长度数字值,
    例如,我列出了以下文件中存储在Tbl_Account中的一些数据:

    • 1, '100', 'Parent1',空
    • 2, '200', 'Parent2',空
    • 3, '300', 'Parent3',空
    • 4,'001','Parent1的第一个孩子',1
    • 5,'002','父母1的第二个孩子',1
    • 6,'001','Parent1的第一个孩子的第一个孩子',4
    • 7,'001','父母1的第二个孩子',5

    现在:我想根据它的父级迁移来改变像bellow这样的代码的值:

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

    注意:ID = 7的记录的代码值:

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

    ID = 5的记录的代码值:

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

1 个答案:

答案 0 :(得分:1)

如果您想在迁移中执行此操作,可以使用原始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

如果您使用代码优先迁移,您可以将其作为字符串变量,并且只是(以该方法)

Sql(<yourStringVariableContainingTheSql);

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

请参阅sqlFiddle以确保结果