Winforms MEF和在运行时加载EntityTypeConfiguration

Winforms MEF和在运行时加载EntityTypeConfiguration,winforms,entity-framework,mef,Winforms,Entity Framework,Mef,你不能在自己的岗位上投票 0 嗨 我正在开发这个(http://arg-co.com/SabteNam%20-%20Copy.zip)的windows应用程序,对于我的DAL,我使用实体框架。但是每个扩展都有自己的EntityTypeConfiguration,所以我决定使用[Import]和[Export]将它们添加到我的DbContext的OnModelCreating方法中。这里的问题是,在位于“SabteNamDataAccess”库的“SabteNamDbContext”类中,“\u

你不能在自己的岗位上投票 0

我正在开发这个(http://arg-co.com/SabteNam%20-%20Copy.zip)的windows应用程序,对于我的DAL,我使用实体框架。但是每个扩展都有自己的EntityTypeConfiguration,所以我决定使用[Import]和[Export]将它们添加到我的DbContext的OnModelCreating方法中。这里的问题是,在位于“SabteNamDataAccess”库的“SabteNamDbContext”类中,“\u Configs”未初始化,因此我无法迭代它并将其项添加到“modelBuilder.Configurations”

在“SampleConfiguration”类的源代码中,我注释掉了“[Export(typeof(IDbConfiguration))]”,但即使取消注释这部分代码,也不会导致应用程序正常工作

有趣的是,如果我在“Main”windows窗体中使用以下代码,“\u Configs”将被初始化:

[ImportMany(typeof(IDbConfiguration))]
public IEnumerable<EntityTypeConfiguration<object>> _Configs { get; set; }
[ImportMany(typeof(IDbConfiguration))]
公共IEnumerable_配置{get;set;}

如何解决这个问题?

虽然我意识到这可能不再对您有用,但我们使用了一个变体,我建议您阅读

在我们的例子中,我们已经为我们的扩展创建了一个接口,不仅是像Scott那样的实体配置,它允许我们不仅加载配置,还允许每个扩展加载工厂和测试数据,向核心应用程序添加新的权限类型,等等

我们的OnModelCreating看起来像这样:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    // load core object mappings
    modelBuilder.Configurations.Add(new UserConfiguration());
    modelBuilder.Configurations.Add(new PermissionConfiguration());

    // get plugin assemblies
    var catalog = new DirectoryCatalog("bin");
    var container = new CompositionContainer(catalog);
    container.ComposeParts();
    var plugins = container.GetExportedValues<IPlugin>();

    // load plugin object mappings
    foreach (IPlugin plugin in plugins)
    {
        plugin.RegisterDomainEntities(modelBuilder.Configurations);
    }

    base.OnModelCreating(modelBuilder);
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
//加载核心对象映射
modelBuilder.Configurations.Add(newuserconfiguration());
modelBuilder.Configurations.Add(newpermissionconfiguration());
//获取插件程序集
var目录=新目录目录(“bin”);
var容器=新的合成容器(目录);
container.ComposeParts();
var plugins=container.GetExportedValues();
//加载插件对象映射
foreach(插件中的IPlugin插件)
{
plugin.registerDomainities(modelBuilder.Configurations);
}
基于模型创建(modelBuilder);
}

我使用MEF本身并加载配置,然后使用Activator.CreateInstance从配置创建实例,并将创建的实例添加到modelBuilder.configurations