7

MSDN говорит, что этот метод «Добавляет операцию для выполнения файла ресурсов SQL». Его подпись:Как использовать метод SqlResource в EF Migrations?

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?

ответ

7

Поскольку 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 с именем sqlResource от узла resourceAssembly (если null - он использует сборку вызовов). Затем текст с этого ресурса обрабатывается как sql, и к нему добавляются регулярные SqlOperation и параметры, которые вы предоставляете.

Существует множество способов вставки произвольного файла в качестве ресурса манифеста в вашу сборку. Легкий способ для такой конкретной ситуации - просто добавить этот файл в проект с помощью действия сборки «Встроенный ресурс». Таким образом, у вас есть файл sql с именем «CreateTables.sql». Щелкните правой кнопкой мыши на проекте Visual Studio, нажмите «Добавить> Существующий элемент», выберите файл «CreateTables.sql», затем щелкните его правой кнопкой мыши в проекте Visual Studio и выберите «Построить действие как« Встроенный ресурс ». Это приведет к ресурсу манифеста с именем DefaultNamespaceOfYourAssembly.Folder.SubFolder.CreateTables.sql (если вы поместите его в корневой каталог, без папок, то, очевидно, пропустите часть Folder.SubFolder), которую затем вы можете использовать как sqlResource в методе выше.

Что касается файла resx, который вы упомянули - этот файл - это ресурс манифеста, но он не может использоваться здесь, потому что вы не можете использовать только часть его (так что некоторый ресурс с данным ключом) - вы можете использовать это в целом, но это xml-файл, а не sql.

+0

Аах, который проливает много света. Несколько лет назад я помню только тусклую память, считая, что файлы могут быть встроенными ресурсами. Помимо того, что я всегда предполагал, когда был обсужден ресурс, он был в файле .resx. – ProfK

+0

Какой замечательный ответ. Спасибо @Evk – erkinyldz