【问题标题】:update a field value according to another in ef根据 ef 中的另一个值更新字段值
【发布时间】:2014-07-11 12:55:10
【问题描述】:

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

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

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

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

  • 1,'100','Parent1',null
  • 2,'200','Parent2',null
  • 3,'300','Parent3',null
  • 4,'001','First Child OF Parent1',1
  • 5,'002','Second Child OF Parent1',1
  • 6,'001','First Child OF First Child Of Parent1',4
  • 7,'001','First Child OF Seccond Child Of Parent1',5

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

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

注意:ID=7的Record的代码值:

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

ID=5 记录的代码值:

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

【问题讨论】:

  • 您想在迁移中执行此操作吗?所以你可以完美地使用原始sql,对吧?
  • 迁移是关于根据您的实体而不是表中的条目来更改数据库的架构。
  • 所以请告诉我最好的方法是什么???,我希望任何用户第一次运行我的程序的新版本,程序会自动更新值

标签: c# entity-framework


【解决方案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

如果你使用 Code first 迁移,你可以把它作为一个字符串变量,然后做(在 th up 方法中)

Sql(<yourStringVariableContainingTheSql);

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

请参阅sqlFiddle 以确认结果

【讨论】:

  • 好的,谢谢,但是其他数据库呢???所有数据库都支持 Transact-SQL WITH common_table_expression??
  • @hosseinab 不,当然。您正在使用不同的数据库?
  • 还没有,但有可能。
  • @hosseinab 好吧,所以你可以为其他数据库使用其他脚本。我必须承认,我从未尝试将 Code first 迁移与不同的目标数据库一起使用...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-31
  • 2021-04-16
  • 1970-01-01
相关资源
最近更新 更多