代码之家  ›  专栏  ›  技术社区  ›  Mike Kantor

EFCache CachingProviderServices缺少静态实例属性

  •  0
  • Mike Kantor  · 技术社区  · 5 年前

    我正在尝试使用EFCache NuGet包( https://github.com/moozzyk/EFCache )在.NET 4.5项目中,并且在启动时遇到此错误:

    System.InvalidOperationException
    HResult=0x80131509
    Message=The Entity Framework provider type '
    EFCache.CachingProviderServices, EFCache, Version=1.1.3.0, 
    Culture=neutral, PublicKeyToken=46c4868af4307d2c' did not have a static 
    property or field named 'Instance'. Entity Framework providers must 
    declare a static property or field named 'Instance' that returns the 
    singleton instance of the provider.
    

    EFCache.CachingProviderServices扩展了System.Data.Entity.Core.Common.DbProviderServices,它没有静态实例属性。因此,在所有情况下,这一财产似乎并不一定都存在。

    查看EFCache.CachingProviderServices的代码,我看不出它有任何合理的方法来拥有静态实例属性,因为它的目的是作为包装器包装另一个作为构造函数参数传递的DBProviderServices实例。

    让EFCache与Entity Framework一起工作的人对发生了什么有什么想法吗?

    EFCache版本是1.1.3.0。我在EntityFramework6.1.0和6.2.0中也看到过同样的问题。Web.config部分如下所示:

      <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
    <providers>
      <provider invariantName="MySql.Data.MySqlClient" type="EFCache.CachingProviderServices, EFCache" />
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
    

    0 回复  |  直到 5 年前
        1
  •  2
  •   Ivan Stoev    5 年前

    此问题是由配置文件中的以下行引起的:

    <provider invariantName="MySql.Data.MySqlClient" type="EFCache.CachingProviderServices, EFCache" />
    

    它应该描述实际的数据库提供程序,对于MySQL,它通常如下所示:

    <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.9.11.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
    

    通常,如链接页面中所述, EFCache.CachingProviderServices 是一个 包装 提供程序,因此它不应该(也不能)注册为常规数据库提供程序(这要求它们提供 Instance 异常中提到的属性/字段)。

    相反,它必须通过自定义激活 DbConfiguration 或静态 EntityFrameworkCache.Initialize() 方法,如中所述 How to use it .