如何在 EF 迁移中使用 SqlResource 方法?

Posted

技术标签:

【中文标题】如何在 EF 迁移中使用 SqlResource 方法?【英文标题】:How do I use the SqlResource method in EF Migrations? 【发布时间】:2017-04-08 06:54:42 【问题描述】:

MSDN 说这个方法“添加一个操作来执行一个 SQL 资源文件”。它的签名是:

protected internal void SqlResource(
    string sqlResource,
    Assembly resourceAssembly = null,
    bool suppressTransaction = false,
    object anonymousArguments = null
)

sqlResource参数被描述为The manifest resource name of the SQL resource file to be executed.是一个“SQL资源文件”,和普通的.resx资源文件一样,如果是这样的话,它可以包含很多文件,那么如何指定名称资源文件,以及该资源中的文件,在这个参数中?或者“SQL 资源文件”是一种不同类型的文件,它只包含一个 SQL 脚本,而我只是将那个文件的名称传递给 sqlResource 参数?

【问题讨论】:

【参考方案1】:

由于 EF 是一个开源框架,最简单的方法是查看源代码:

protected internal void SqlResource(string sqlResource, Assembly resourceAssembly = null, bool suppressTransaction = false, object anonymousArguments = null)

    Check.NotEmpty(sqlResource, "sqlResource");

    resourceAssembly = resourceAssembly ?? Assembly.GetCallingAssembly();

    if (!resourceAssembly.GetManifestResourceNames().Contains(sqlResource))
    
            throw new ArgumentException(Strings.UnableToLoadEmbeddedResource(resourceAssembly.FullName, sqlResource));
    

    using (var textStream = new StreamReader(resourceAssembly.GetManifestResourceStream(sqlResource)))
    
        AddOperation(
            new SqlOperation(textStream.ReadToEnd(), anonymousArguments)
                
                    SuppressTransaction = suppressTransaction
                );
    

您可以在此处看到,此方法首先从程序集 resourceAssembly 中读取名称为 sqlResource 的 manifest resource(如果为 null - 它使用调用程序集)。然后将此资源中的文本视为 sql 并添加常规 SqlOperation 和您提供的参数。

有很多方法可以将任意文件作为清单资源嵌入到程序集中。对于这种特殊情况,简单的方法是使用构建操作“嵌入式资源”将此文件添加到项目中。所以你有一个名为“CreateTables.sql”的sql文件。右键单击您的 Visual Studio 项目,单击“添加 > 现有项”,选择“CreateTables.sql”文件,然后在 Visual Studio 项目中右键单击它并选择“构建操作”作为“嵌入式资源”。这将导致名称为DefaultNamespaceOfYourAssembly.Folder.SubFolder.CreateTables.sql 的清单资源(如果将其放在根目录中,没有文件夹,则显然跳过Folder.SubFolder 部分),然后您可以在上述方法中将其用作sqlResource

至于你提到的 resx 文件 - 该文件本身 清单资源,但它不能在这里使用,因为你不能只使用它的一部分(所以一些具有给定键的资源) -只能整体使用,但它是xml文件而不是sql。

【讨论】:

啊,这揭示了很多。几年前,我只有一个模糊的记忆,阅读文件可以成为嵌入式资源。除此之外,我一直认为在谈论资源时,它位于 .resx 文件中。 多么了不起的答案。谢谢@Evk 是的,很好的答案。太糟糕了,似乎没有办法进行变量替换。我想我仍然可以将 sql 存储在资源文件中,而不是将 sql 字符串直接嵌入代码中并将其传递给 EF 的 Database.ExecuteSqlCommand。

以上是关于如何在 EF 迁移中使用 SqlResource 方法?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 asp.net 5 项目中启用迁移(EF6)?

在快速自定义的NopCommerce中使用实体框架(EF)代码优先迁移

如何使用 Docker 在 SQL Server 数据库上运行 EF Core 迁移?

如何在 EF Core Code First 中自定义迁移生成?

如何使用 ASP.NET Core 设置 EF6 迁移

如何在 Azure 的 ConfigurationManager.ConnectionStrings 上使用 ConnectionStrings 创建 EF 迁移?