【问题标题】:Entity Framework Error when using Unity使用 Unity 时出现实体框架错误
【发布时间】:2018-01-30 21:30:17
【问题描述】:

在尝试解析我的服务类时,我收到一个错误,指出无法构造 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>

统一注册:

因此,我的问题是 EF 如何确定如何构建此类,因为很明显我在配置中遗漏了一些东西。

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

【问题讨论】:

  • 我看过那个问题,但我不明白相关性。我正在注册 DbContext 类型。
  • 在这种情况下可以进行 DI 吗? "MyDbContext : System.Data.Entity.DbContext, IMyDbContext"
  • 是 - 许多 EF 应用程序使用 DI
  • 请贴出MyDbContext和MRepository的相关DI配置代码。

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


【解决方案1】:

根据this answer:

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

所以,你有两个选择:

  1. 向 Unity 注册 IMyDbContext 接口
  2. 停止使用IMyDbContext 并使用具体类型(在这种情况下,Unity 会自动解析它,尽管您可能需要手动执行以控制生命周期)

请注意,将接口与 DI 一起使用的主要目的是能够交换实现,因此如果您的应用程序实际上没有将一个相同的数据库架构换成另一个,在这种情况下您可能不需要该接口。

【讨论】:

  • 但是,查看调用堆栈,它甚至没有尝试解析 IDbContext,而是 IMyDbContext - 已注册。
  • 糟糕。那是一个错字。
  • 我正在注册 IMyDbContext。查看错误,它似乎在尝试实例化 MyDbContext 时抱怨 DbConnerction - 所以错误不是它找不到 IoC 引用,而是它无法实例化它
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-28
    • 1970-01-01
    • 1970-01-01
    • 2017-07-03
    • 1970-01-01
    • 1970-01-01
    • 2014-02-01
    相关资源
    最近更新 更多