在实体框架迁移期间读取数据库(选择查询)
本文关键字:数据库 选择 查询 读取 实体 框架 迁移 | 更新日期: 2023-09-27 17:58:56
我知道我可以在迁移过程中使用Sql
方法更新数据,它非常适合用纯SQL表示的简单事情。
我也知道我可以使用Seed
方法,但这感觉像是黑客攻击(我想写的代码必须在执行迁移时执行一次)。
在我目前的情况下,我需要从一列中剥离HTML标记,并将其写入迁移中添加的新列中。我已经有一个C#方法可以做到这一点。我想做的是迭代C#中的每一行,并为每一行生成一条SQL语句,该语句将用相应的HTML剥离文本更新该行。
更普遍地说,我认为在迁移过程中能够用C#读取数据库在很多情况下都很方便。在迁移事务中这样做是完美的,但为此,我需要检索实体框架内部用于迁移的SQL连接。
到目前为止,我还没有找到执行返回结果的SQL查询的方法。这可能吗?
比起Seed方法,我更喜欢转换迁移文件中的数据。
更新数据应该不是问题,您可以按照下面的行代码所示进行操作,还可以在SQL字符串中传递C#中的参数:
Sql("UPDATE TableName SET MyValueInMinutes= -DATEDIFF(MINUTE, CurrentTime, 0)";
数据读取的问题!事实上,您永远不需要在C#中处理数据传输,通常您在SQL server中创建所有内容(存储过程和函数以及SQL stametents),并且您可以在需要它们或数据准备好传输时从迁移文件中调用它们。但我认为你不是一个数据库程序员,这就是为什么你试图用C#处理数据。
下面是一个如何迭代行的例子,我将搜索给定的文本,并为您找到一个免费的"AnyText"+计数器。
CREATE PROCEDURE sp_FindFreeName
@toBeFindName nvarchar(MAX) OUT
AS
BEGIN
DECLARE @LoopCounter INTEGER
SET @LoopCounter = 1
WHILE EXISTS (SELECT @toBeFindName FROM dbo.MyTable WHERE Name = @toBeFindName)
BEGIN
SET @toBeFindName = 'AnyText', @LoopCounter)
SET @LoopCounter = @LoopCounter + 1
END
END
然后你可以调用表格C#:
var cSharpName = string.Empty;
Sql("exec sp_FindFreeName @toBeFindName=@"+ cSharpName +" OUTPUT");
其中cSharpName由C#给定。
第三个原因是,您还可以编写自己的代码优先迁移操作。您必须定义您的SqlServerMigrationSqlGenerator,如Rowan博客中所述:
https://romiller.com/2013/02/27/ef6-writing-your-own-code-first-migration-operations/
结论:
如果您真的想读取迁移文件中的数据,那么您必须使用例如:SqlDataReader,并且还必须从App.config中读取连接字符串。
在大多数用例中,您可以在SQL Server中执行所有操作。只需创建数据传输格式SQL脚本并从所需位置执行即可。
您可以使用Extensions和SqlServerMigrationSqlGenerator以比DataReader更干净的方式来实现这一点。