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

时间:2016-07-27 09:38:31

标签: c# entity-framework ef-migrations

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

我也知道我可以使用Seed方法,但这会感觉像是一个黑客(我想写的代码必须在执行迁移时执行一次)。

在我目前的情况下,我需要从列中删除HTML标记,并将其写入迁移中添加的新列。我已经有一个C#方法就是这么做的。我想要做的是迭代C#中的每一行,并为每一行生成一个SQL语句,该行将使用相应的HTML剥离文本更新行。

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

到目前为止,我发现无法执行返回结果的SQL查询。这可能吗?

1 个答案:

答案 0 :(得分:1)

我也更喜欢通过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#。

为什么要这样做,您还可以编写自己的Code First Migration Operations。您必须按照Rowan博客中所述定义您的SqlServerMigrationSqlGenerator:

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

<强> 结论:

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

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

您可以使用Extensions和SqlServerMigrationSqlGenerator以更简洁的方式执行此操作,然后使用DataReader。