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

How do I use the SqlResource method in EF Migrations?

MSDN 说这个方法 "Adds an operation to execute a SQL resource file"。它的签名是:

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 resource file"和普通的.resx资源文件一样,如果是的话,它可以包含很多文件,那么如何在这个参数中指定资源文件的名称以及该资源中的文件?或者 "SQL resource file" 是一种不同类型的文件,它只包含一个 SQL 脚本,而我只是将那个文件的名称传递给 sqlResource 参数?

由于 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 中读取名称为 sqlResourcemanifest resource(如果为 null - 它使用调用程序集)。然后来自此资源的文本被视为 sql 并添加常规 SqlOperation 和您提供的参数。

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

至于你提到的 resx 文件 - 该文件本身 清单资源,但它不能在这里使用,因为你不能只使用它的一部分(所以一些资源与给定的密​​钥) - 你只能将它作为一个整体使用,但它是 xml 文件而不是 sql.