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

标签 c# sql-server entity-framework entity-framework-6 entity-framework-migrations

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

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

sqlResource参数描述为要执行的SQL资源文件的 list 资源名称。是一个“SQL资源文件”,和普通的.resx 资源文件,如果是这样,它可以包含很多文件,那么如何在这个参数中指定资源文件的名称以及该资源中的文件?或者“SQL 资源文件”是一种不同类型的文件,它只包含一个 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
                });
    }
}

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

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

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

关于c# - 如何在 EF 迁移中使用 SqlResource 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40778446/

相关文章:

C# - 构造函数的链式调用

c# - 即使属性值未更改,也会触发 Propertychanged 事件

java - Hibernate 将东方符号而不是拉丁符号写入 SQL Server

c# - 实体类型 ApplicationUser 不是当前上下文模型的一部分

sql-server - 在 Entity Framework 中使用 savechanges() 时列名称无效

C# Visual Studio - 我正在尝试读取文本文件并将其显示到 Richtextbox 中并包含新行

c# - 无需点击按钮即可发布

SQL Server 查看主键

c# - 在 Entity Framework 存储库中使用选择器

c# - 如何以编程方式配对蓝牙设备