有没有办法在不实际连接到数据库的情况下创建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 :(得分:1)
dbContext是数据库的抽象。如果没有数据库,则没有抽象。您可以在不连接数据库的情况下创建DbContext。 如果为上下文将数据库初始化程序设置为null,则Code First将永远不会尝试为您创建数据库:
DbDatabase.SetInitializer<MyContext>(null);
但它对你的情况没用
答案 1 :(得分:0)
请参阅this answer类似问题(下面的简化代码) - 这仅适用于Code First(EDMX版本位于链接答案中)。关键是使用&#34; App = EntityFramework&#34;创建上下文。连接字符串。
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
参数的构造函数,您将其作为代理传递给调用
答案 2 :(得分:0)
如果有人正在寻找一种方法来创建 dbContext
而无需连接到数据库只是为了访问元数据:您可以创建静态只读字段并使用内存提供程序初始化 dbContext
,如下所示:>
public static readonly AppDbContext DbContextForMetadata = new BillingDbContext(new DbContextOptionsBuilder<AppDbContext>()
.UseInMemoryDatabase(Guid.NewGuid().ToString())
.Options);
并在您的整个应用程序中使用它,以便在您需要的任何地方访问元数据。