在不连接数据库的情况下创建DbContext

时间:2014-01-09 01:27:40

标签: c# .net entity-framework 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元数据。

3 个答案:

答案 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);

并在您的整个应用程序中使用它,以便在您需要的任何地方访问元数据。