3

次の Unity ロジックを使用する 2 つのプロジェクトがあります。

container.RegisterType<IUnitOfWork, MyDbContext>(
    new HierarchicalLifetimeManager(),
    new InjectionFactory(
        c => new MyDbContext(configurationService.MySqlConnectionString)
    )
);
container.RegisterType<DbContext, MyDbContext>(
    new HierarchicalLifetimeManager()
);

最初のプロジェクトは、Unity.MVC4パッケージを利用する Web アプリケーションです。そのため、特注の DependencyResolver がいくつかの作業を行っています。これは完全に機能します。

2 つ目は非 Web アプリケーションであるため、通常のUnityパッケージ インスタンスを使用しますが、 MyDbContextを使用する呼び出しが行われるとエラーが発生します。例外は

System.Data.Entity.Core.MetadataException: 指定されたスキーマが無効です。エラー: EntityDataModel.MyProject.ssdl(2,2): エラー 0152: Entity Framework プロバイダーの種類 'System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' 'System.Data.SqlClient' の ADO.NET プロバイダーを読み込めませんでした。プロバイダー アセンブリが実行中のアプリケーションで使用できることを確認します。詳細については 、http: //go.microsoft.com/fwlink/?LinkId=260882を参照してください。

問題の原因を2番目のプロジェクトのUnityロジックに分離するために、別のプロジェクトにある同じサービスを呼び出すように両方のプロジェクトをセットアップしました。ORM として Entity Framework 6 を使用していることにも注意してください。

私の質問は、2 番目のプロジェクトを機能させるためにどの Unity コードが必要か、または EF アセンブリを参照するために追加できる app.config エントリがあるかどうかです。

更新: いくつかの追加作業の後、DbContext アセンブリを参照すると次のことに気付きました。

  • EntityFramework
  • EntityFramework.SqlServer

2番目のプロジェクトでは、問題はなくなります。私のクライアント プロジェクトは ORM の知識を持つべきではないため、これらのアセンブリを参照することは避けたいと考えています。

接続文字列の更新も試みたので、このStackOverflow の質問に記載されているように、ORM プロジェクトのアセンブリ (EDMX ファイルがある場所) を手動で指定していますが、違いはありません。

メタデータ=res://nameOfDll/Model.csdl|res://nameOfDll/Model.ssdl|res://nameOfDll/Model.msl

4

1 に答える 1