Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从程序集创建MetadataWorkspace时加载不同的数据空间?_C#_Entity Framework - Fatal编程技术网

C# 从程序集创建MetadataWorkspace时加载不同的数据空间?

C# 从程序集创建MetadataWorkspace时加载不同的数据空间?,c#,entity-framework,C#,Entity Framework,编辑:我发现如果我从上下文创建工作区(var-workspace= ((IObjectContextAdapter)context.ObjectContext.MetadataWorkspace;)其他数据空间实际上包含项集合,而不是null。所以我想现在的问题是:如何在不实例化DbContext的情况下访问CSpace、CSSpace等 我试图从使用一组程序集创建的MetaDataWorkSpace加载ItemCollections。为了消除可能出现的错误,我制作了一个包含模型的简单类库,构建

编辑:我发现如果我从上下文创建工作区(
var-workspace=
((IObjectContextAdapter)context.ObjectContext.MetadataWorkspace;
)其他数据空间实际上包含项集合,而不是null。所以我想现在的问题是:如何在不实例化DbContext的情况下访问CSpace、CSSpace等

我试图从使用一组程序集创建的MetaDataWorkSpace加载ItemCollections。为了消除可能出现的错误,我制作了一个包含模型的简单类库,构建了它,进行了代码优先迁移,现在我正在加载在此过程中创建的.dll

模型的代码可以在这里找到:(虽然不重要)

这是DbContext:

namespace SampleMappingAssembly
{
    class AnimalContext:DbContext
    {
        public virtual DbSet<Person> People { get; set; }
        public virtual DbSet<Animal> Animals { get; set; }
        public AnimalContext()
        {

        }
    }
}
命名空间SampleMappingAssembly
{
类AnimalContext:DbContext
{
公共虚拟数据库集人员{get;set;}
公共虚拟数据库集


我必须承认,我对这个主题的理解相当有限,但现在我真的陷入了困境。我做错了什么?

好吧,只有
OSpace
(“对象空间”)包含实际的对象集合。其他空间只包含描述数据库模型的元数据、包含的关系/映射等。(或许可以看一看)。为什么您试图从不同于
OSpace
的空间获取项目?我实际上感兴趣的是自定义映射,因为我正在尝试读取它们。我正在开发一个工具,该工具旨在查看EF元数据并验证概念模型(=C-space?CS-space?)针对相应数据库服务器上的元数据表。
namespace WorkSpaceLoader
{
    class Program
    {
        static void Main(string[] args)
        {
            //The directory where the .dll is
            string directory = @"D:\Zwischenablage\LiterallyCodeFirst";
            //Filter because there's more files in this than just the ones I want to load
            var assemblyPaths = System.IO.Directory.EnumerateFiles(directory)
                .Where(s => s.EndsWith(".dll") && s.Contains("Sample"));
            var assemblies = new List<Assembly>();
            foreach(string path in assemblyPaths)
            {
                try
                {
                    //One of these is an assembly which I can't load due to unrelated reasons so Try-Catch
                    assemblies.Add(Assembly.LoadFile(path));
                }
                catch(Exception ex)
                {
                    Console.WriteLine($"Couldn't load {path.Split('\\').Last()}:\n{ex.Message}\n");
                }
            }
            Console.WriteLine($"Successfully loaded {assemblies.Count} assemblies. Creating workSpace...");
            //Not sure about the res:// part, but according to my book it's the pattern to look at every DataSpace
            var workspace = new MetadataWorkspace(new string[] {@"res://*"}, assemblies); //@"res://*/"
            Console.WriteLine("Successfully converted assemblies to MetadataWorkspace...");
            List<ItemCollection> coll = new List<ItemCollection>();
            //Iterating over DataSpaces
            for (int i = 0; i <= 4 ; i++)
            {
                var collection = GetItemsFromDataSpace(workspace, (DataSpace)i);
                if (collection != null)
                    coll.Add(collection);
            }
            Console.WriteLine("\nDone loading ItemCollections");
            Console.ReadKey();
        }

        public static ItemCollection GetItemsFromDataSpace(MetadataWorkspace workspace, DataSpace dataSpace)
        {
            ItemCollection items;
            try
            {
                //Not using TryGetItemCollection because I wanted to see the exception
                items = workspace.GetItemCollection(dataSpace);
                Console.WriteLine($"\nSuccessfully retrieved ItemCollection from {dataSpace.ToString()}");
                return items;
            }
            catch(Exception ex)
            {
                Console.WriteLine($"\nUnable to retrieve Item collection from {dataSpace.ToString()}");
                Console.WriteLine($"\n{ex.ToString()}\n");
                return null;
            }
        }
    }
}