由於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。
來源
2016-11-28 08:41:58
Evk
啊,那流光溢彩。多年前,我只有一個模糊的記憶,那就是可以將文件製作成嵌入式資源。除此之外,我一直假設資源被討論過,它在.resx文件中。 – ProfK
多麼驚人的答案。謝謝@Evk – erkinyldz