有用見this answer到類似的問題(下面的簡化代碼) - 這僅適用於Code First(EDMX版本在鏈接的答案中)。關鍵是使用「App = EntityFramework」連接字符串創建上下文。
public static MetadataWorkspace GetMetadataWorkspaceFromCodeFirst<TContext>(Func<string, TContext> createFromConnectionString) where TContext : DbContext
{
using (var ctx = createFromConnectionString("App=EntityFramework"))
using (var ms = new MemoryStream())
using (var writer = new XmlTextWriter(ms, Encoding.UTF8))
{
EdmxWriter.WriteEdmx(ctx, writer);
ms.Seek(0, SeekOrigin.Begin);
var xDoc = XDocument.Load(ms);
var runtime = xDoc.Root.Elements().First(c => c.Name.LocalName == "Runtime");
var cSpaceLoader = new EdmItemCollection(GetXmlReader(runtime, "ConceptualModels"));
var sSpaceLoader = new StoreItemCollection(GetXmlReader(runtime, "StorageModels"));
var mSpaceLoader = new StorageMappingItemCollection(cSpaceLoader, sSpaceLoader,
GetXmlReader(runtime, "Mappings"));
return new MetadataWorkspace(() => cSpaceLoader,() => sSpaceLoader,() => mSpaceLoader);
}
}
private static IEnumerable<XmlReader> GetXmlReader(XContainer runtimeElement, string elementName)
{
var model = runtimeElement.Elements().First(c => c.Name.LocalName == elementName).Elements().First();
yield return XmlReader.Create(new StringReader(model.ToString()));
}
要求您DbContext
有一個string
參數的構造函數,你傳遞作爲代表進入呼叫
你可以當你有一個EDMX文件,請參閱http://stackoverflow.com/a/ 36357185/1860652 - 不確定代碼優先 – AlexFoxGill
如果我有EDMX文件,那麼我可以從那裏讀取CSDL/SSDL,而不必使用DbContext。雖然有趣的鏈接,所以謝謝。 –
檢查完整答案 - 您可以使用EdmxWriter在內存中創建一個EDMX,然後處理該內容。它需要一段時間,但它是可行的! – AlexFoxGill