使用Unity时实体框架错误

时间:2018-01-30 08:10:05

标签: c# entity-framework dependency-injection entity-framework-6 unity-container

在尝试解析我的服务类时,我收到一条错误DbContext无法构造,因为它是一个抽象类。错误消息在这里:

Unity.Exceptions.ResolutionFailedException: 'Resolution of the dependency failed, type = 'MyService.MyClass', name = '(none)'.
Exception occurred while: while resolving.
Exception is: InvalidOperationException - The current type, System.Data.Common.DbConnection, is an abstract class and cannot be constructed. Are you missing a type mapping?
-----------------------------------------------
At the time of the exception, the container was: 
  Resolving ...
      ...
          Resolving MyApp.MyRepository,(none)
          Resolving parameter 'myDbContext' of constructor MyApp.MRepository(MyApp.IMyDbContext myDbContext)
          ...
              Resolving parameter 'existingConnection' of constructor MyApp.MyDbContext(System.Data.Common.DbConnection existingConnection, System.Data.Entity.Infrastructure.DbCompiledModel model, System.Boolean contextOwnsConnection)
                Resolving System.Data.Common.DbConnection,(none)
'

DBContext看起来像这样:

public class MyDbContext : System.Data.Entity.DbContext, IMyDbContext
{
    public MyDbContext()
        : base("MainConnectionString")
    {
    }

我的猜测是EF在配置文件中查找连接字符串;但是定义了连接字符串:

<connectionStrings>
    <add name="MainConnectionString" connectionString="Server=.\SQLEXPRESS;Database=MyDB;User Id= . . ." providerName="System.Data.SqlClient" />
</connectionStrings>

Unity注册:

因此,我的问题是,EF如何解决如何构建这个类,显然我在配置中缺少一些东西。

UnityContainer container = new UnityContainer();
container.RegisterType<IMyDbContext, MyDbContext>();
container.RegisterType<IMyRepository, MyRepository>();
container.RegisterInstance<IUnityContainer>(container);

2 个答案:

答案 0 :(得分:0)

根据this answer

  

Unity将解析具体类型(.Resolve),但必须通过将接口与具体类型相关联来显式注册接口。

所以,你有两个选择:

  1. 向Unity注册IMyDbContext界面
  2. 停止使用IMyDbContext并使用具体类型(在这种情况下,Unity会自动解决它,尽管您可能需要手动执行以控制生命周期)
  3. 请注意,使用DI接口的主要目的是能够交换实现,因此,如果您的应用程序实际上没有交换另一个相同的数据库模式在这种情况下,你可能不需要界面。

答案 1 :(得分:0)

我设法通过更改注册以显式传递连接字符串名称来实现此功能:

UnityContainer container = new UnityContainer();
container.RegisterType<IMyDbContext, MyDbContext>(new InjectionConstructor("MainConnectionString"));
. . .
container.RegisterInstance<IUnityContainer>(container);