在 entity framework 迁移期间读取数据库(select 查询)
Read database during an entity framework migration (select query)
我知道我可以使用 Sql
方法在迁移过程中更新数据,它非常适合可以用纯 SQL.
表达的简单事物
我也知道我可以使用 Seed
方法,但这感觉就像是 hack(我想编写的代码必须在执行迁移时执行一次)。
在我当前的情况下,我需要从列中删除 HTML 标记,并将其写入迁移中添加的新列。我已经有一个 C# 方法可以完全做到这一点。我想要做的是遍历 C# 中的每一行,并为每一行生成一个 SQL 语句,该语句将使用相应的 HTML-剥离文本更新该行。
更一般地说,我认为能够在迁移期间使用 C# 读取数据库在很多情况下都很方便。在迁移事务中这样做是完美的,但为此我需要检索 Entity Framework 内部用于迁移的 SQL 连接。
到目前为止,我发现无法执行 returns 结果的 SQL 查询。这可能吗?
我也更喜欢通过 Seed 方法转换迁移文件中的数据。
更新数据应该没有问题,您可以按照下面的行代码所示操作,也可以在 SQL 字符串中从 C# 传递参数:
Sql("UPDATE TableName SET MyValueInMinutes= -DATEDIFF(MINUTE, CurrentTime, 0)";
数据读取问题!实际上,您永远不需要在 C# 中处理数据转换,通常您在 SQL 服务器中创建所有内容(存储过程和函数以及 SQL stametents),您可以从迁移文件中调用它们需要它们或数据准备好转换的时间点。但我认为您不是数据库程序员,所以您尝试用 C# 处理数据。
这是一个如何遍历行的示例,我将搜索给定的文本并为您找到一个免费的 'AnyText'+Counter。
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");
其中从 C# 给出的 cSharpName。
第三个为什么要这样做你也可以编写自己的代码优先迁移操作。您必须按照 Rowan 博客中所述定义 SqlServerMigrationSqlGenerator:
https://romiller.com/2013/02/27/ef6-writing-your-own-code-first-migration-operations/
结论:
如果你真的想读取迁移文件中的数据,那么你必须使用例如:SqlDataReader 并且你还必须从 App.config.
中读取连接字符串
在大多数情况下,您可以在 SQL 服务器中执行所有操作。只需创建您的数据转换 SQL 脚本并从所需位置执行它们。
您可以使用 Extensions 和 SqlServerMigrationSqlGenerator 以一种比 DataReader 更干净的方式来做到这一点。
我知道我可以使用 Sql
方法在迁移过程中更新数据,它非常适合可以用纯 SQL.
我也知道我可以使用 Seed
方法,但这感觉就像是 hack(我想编写的代码必须在执行迁移时执行一次)。
在我当前的情况下,我需要从列中删除 HTML 标记,并将其写入迁移中添加的新列。我已经有一个 C# 方法可以完全做到这一点。我想要做的是遍历 C# 中的每一行,并为每一行生成一个 SQL 语句,该语句将使用相应的 HTML-剥离文本更新该行。
更一般地说,我认为能够在迁移期间使用 C# 读取数据库在很多情况下都很方便。在迁移事务中这样做是完美的,但为此我需要检索 Entity Framework 内部用于迁移的 SQL 连接。
到目前为止,我发现无法执行 returns 结果的 SQL 查询。这可能吗?
我也更喜欢通过 Seed 方法转换迁移文件中的数据。
更新数据应该没有问题,您可以按照下面的行代码所示操作,也可以在 SQL 字符串中从 C# 传递参数:
Sql("UPDATE TableName SET MyValueInMinutes= -DATEDIFF(MINUTE, CurrentTime, 0)";
数据读取问题!实际上,您永远不需要在 C# 中处理数据转换,通常您在 SQL 服务器中创建所有内容(存储过程和函数以及 SQL stametents),您可以从迁移文件中调用它们需要它们或数据准备好转换的时间点。但我认为您不是数据库程序员,所以您尝试用 C# 处理数据。
这是一个如何遍历行的示例,我将搜索给定的文本并为您找到一个免费的 'AnyText'+Counter。
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");
其中从 C# 给出的 cSharpName。
第三个为什么要这样做你也可以编写自己的代码优先迁移操作。您必须按照 Rowan 博客中所述定义 SqlServerMigrationSqlGenerator:
https://romiller.com/2013/02/27/ef6-writing-your-own-code-first-migration-operations/
结论:
如果你真的想读取迁移文件中的数据,那么你必须使用例如:SqlDataReader 并且你还必须从 App.config.
中读取连接字符串在大多数情况下,您可以在 SQL 服务器中执行所有操作。只需创建您的数据转换 SQL 脚本并从所需位置执行它们。
您可以使用 Extensions 和 SqlServerMigrationSqlGenerator 以一种比 DataReader 更干净的方式来做到这一点。