在实体框架迁移期间读取数据库(选择查询)

you*_*uen 5 c# entity-framework ef-migrations

我知道我可以Sql在迁移过程中使用该方法来更新数据,它对于可以用纯SQL表示的简单事物非常有用。

我也知道我可以使用一种Seed方法,但是感觉就像是一种hack(执行迁移时,我要编写的代码必须执行一次)。

在当前情况下,我需要从列中剥离HTML标记,并将其写入到迁移中添加的新列中。我已经有一个C#方法可以做到这一点。我想要做的是遍历C#中的每一行,并为每一行生成一条SQL语句,该语句将使用相应的HTML剥离文本来更新该行。

更普遍地说,我认为在迁移过程中能够使用C#读取数据库在许多情况下会很方便。在迁移事务中这样做非常完美,但是为此,我需要检索Entity Framework内部用于迁移的SQL连接。

到目前为止,我还没有找到执行返回结果的SQL查询的方法。这可能吗?

Bas*_*ili 1

我还更喜欢通过种子方法转换迁移文件中的数据。

更新数据应该不是问题,您可以按照下面的行代码所示进行操作,也可以在 SQL 字符串中传递来自 C# 的参数:

Sql("UPDATE TableName SET MyValueInMinutes= -DATEDIFF(MINUTE, CurrentTime, 0)";
Run Code Online (Sandbox Code Playgroud)

数据读取的问题!实际上,您永远不需要在 C# 中处理数据转换,通常您在 SQL Server 中创建所有内容(存储过程和函数以及 SQL 状态),并且您可以在需要时或在需要时从迁移文件中调用它们数据已准备好进行转换。但我认为你不是数据库程序员,这就是你尝试用 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 
Run Code Online (Sandbox Code Playgroud)

然后就可以调用C#表单了:

var cSharpName = string.Empty;
Sql("exec sp_FindFreeName @toBeFindName=@"+ cSharpName +" OUTPUT");
Run Code Online (Sandbox Code Playgroud)

其中 cSharpName 由 C# 给出。

第三个原因是您还可以编写自己的 Code First 迁移操作。您必须按照 Rowan 博客中所述定义 SqlServerMigrationSqlGenerator:

https://romiller.com/2013/02/27/ef6-writing-your-own-code-first-migration-operations/

结论:

如果您确实想读取迁移文件中的数据,那么您必须使用例如:SqlDataReader,并且还必须从 App.config 读取连接字符串。

在大多数用例中,您可以在 SQL Server 中执行所有操作。只需创建数据转换 SQL 脚本并从所需位置执行它们。

您可以使用扩展和 SqlServerMigrationSqlGenerator 以比 DataReader 更干净的方式执行此操作。

  • 由于没有人提供更好的答案,我接受这个;特别是对于这一部分:“您必须使用 SqlDataReader 并且还必须从 App.config 读取连接字符串”。这似乎是我的具体问题的唯一答案,即使这确实不是一个好方法。 (2认同)