7

MSDN說這個方法「添加一個操作來執行一個SQL資源文件」。它的簽名是:如何在EF遷移中使用SqlResource方法?

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 
       }); 
    } 
} 

您可以在這裏看到,該方法首先從裝配resourceAssembly讀取manifest resource名爲sqlResource(如果爲null - 它使用調用程序集)。然後,來自此資源的文本將被視爲sql,並且會隨其添加常規SqlOperation以及您提供的參數。

有很多方法可以將任意文件作爲mantifest資源嵌入到程序集中。對於這種特殊情況,簡單的方法是使用構建操作「Embedded Resource」將該文件添加到項目中。所以你有一個名爲「CreateTables.sql」的sql文件。右鍵單擊Visual Studio項目,單擊「添加>現有項目」,選擇您的「CreateTables.sql」文件,然後在Visual Studio項目中右鍵單擊它,然後選擇構建操作爲「嵌入式資源」。這將導致名稱爲DefaultNamespaceOfYourAssembly.Folder.SubFolder.CreateTables.sql的清單資源(如果您將其放在根目錄中,而沒有文件夾,那麼顯然會跳過Folder.SubFolder部分),然後您可以在上述方法中將其用作sqlResource

至於RESX文件,你提到的 - 該文件本身清單資源,但它不能在這裏使用,因爲你不能只使用其中的一部分(所以一些資源給定鍵) - 只能使用它作爲一個整體,但它的XML文件,而不是SQL。

+0

啊,那流光溢彩。多年前,我只有一個模糊的記憶,那就是可以將文件製作成嵌入式資源。除此之外,我一直假設資源被討論過,它在.resx文件中。 – ProfK

+0

多麼驚人的答案。謝謝@Evk – erkinyldz