2014-01-09 71 views
3

有沒有一種方法可以創建一個DbContext而不需要實際連接到數據庫?創建一個DbContext而不連接到數據庫

我希望能夠訪問CSDL和SSDL元,像這樣:

var objContext = ((IObjectContextAdapter)myDbContext).ObjectContext; 
var ssdl = objContext.MetadataWorkspace.GetItemCollection(DataSpace.SSpace); 
var csdl = objContext.MetadataWorkspace.GetItemCollection(DataSpace.CSpace); 

,但我不希望在所有訪問數據庫。理想情況下,我希望能夠在沒有數據庫的情況下訪問SSDL/CSDL元數據。

+0

你可以當你有一個EDMX文件,請參閱http://stackoverflow.com/a/ 36357185/1860652 - 不確定代碼優先 – AlexFoxGill

+0

如果我有EDMX文件,那麼我可以從那裏讀取CSDL/SSDL,而不必使用DbContext。雖然有趣的鏈接,所以謝謝。 –

+0

檢查完整答案 - 您可以使用EdmxWriter在內存中創建一個EDMX,然後處理該內容。它需要一段時間,但它是可行的! – AlexFoxGill

回答

1

dbContext是對數據庫的抽象。如果沒有數據庫,那麼就沒有抽象。你可以在不連接數據庫的情況下創建一個DbContext。 如果將數據庫初始化爲null您的上下文,然後代碼首先將永遠不會嘗試爲您創建一個數據庫:

DbDatabase.SetInitializer<MyContext>(null); 

但它不是你的情況

+1

有沒有什麼辦法可以獲得沒有DbContext/ObjectContext和數據庫的元數據? –

0

有用見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參數的構造函數,你傳遞作爲代表進入呼叫