Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在EF迁移中使用SqlResource方法?_C#_Sql Server_Entity Framework_Entity Framework 6_Entity Framework Migrations - Fatal编程技术网

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

C# 如何在EF迁移中使用SqlResource方法?,c#,sql-server,entity-framework,entity-framework-6,entity-framework-migrations,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资源文件的清单资源名称。是

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

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

sqlResource
参数被描述为
要执行的SQL资源文件的清单资源名称。
是一个“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
                });
    }
}
您可以在这里看到,此方法首先从assembly
resourcesassembly
读取名为
sqlResource
(如果为null,则使用调用assembly)。然后,此资源中的文本被视为sql,并随它和您提供的参数一起添加常规的
SqlOperation

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


至于您提到的resx文件,该文件本身是清单资源,但不能在这里使用,因为您不能仅使用其中的一部分(因此某些具有给定密钥的资源)-您只能将其作为一个整体使用,但它是xml文件,而不是sql。

Aah,这一点非常清楚。我只记得,几年前,读到文件可以被嵌入到资源中。除此之外,我一直认为当谈论资源时,它在.resx文件中。这是一个多么令人惊讶的答案。谢谢@EvkYes,回答得很好。太糟糕了,似乎没有办法进行变量替换。我想我仍然可以将sql存储在一个资源文件中,而不是直接将sql字符串嵌入代码中,并将其传递给EF的Database.executesql命令。