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;
}
}
}
}