EF6-为什么我所有的DbSet枚举它们时都抛出InvalidOperationException?

时间:2019-02-26 10:24:15

标签: c# entity-framework entity-framework-6

我对我在配置中缺少的东西或任何阻碍我前进的东西感到困惑。

我要做什么?我最初的测试用例只是获取一个集合,将其.ToList()传递给API。您的标准EF查询。

代码

using (var _dbContext = new FooContext())
            {
                ICollection<Location> locationItems = _dbContext.Locations.ToList();
                return locationItems;
            }

我真的不觉得这是必要的,但这就是一切。

我怎么了?

在这一点上,它对我而言不再有意义,并向我提供了强烈的迹象,表明在后台存在某些我完全错过的东西。这很可能是非常简单的配置块或设置。 当我尝试.ToList()我的位置,或用调试器枚举它们(确实是一样的东西)时,我在_dbContext知道的每个单个集合上都会抛出“ InvalidOperationException”。

让我排除明显的问题,问答时间。

问:它甚至连接到您的数据库吗?

A:是的,_dbContext.Database.Exists()向我返回了一个 true ,使用调试器检查 _dbContext.Database 也给了我很多匹配信息,以确认是否存在联系到我要与之交谈的SQL服务器上。

问:您的SQL数据库中是否有数据?

A:是的,很多。已通过SSMS检查。

问:您的DbContext甚至知道那些集合吗?

A:我相信吗?

public class FooContext : DbContext
    {
        public FooContext() : base("name=FooDB")
        {
        }

        public DbSet<Car> Cars { get; set; }
        public DbSet<FooEntry> FooEntries { get; set; }
        public DbSet<ContactDetails> ContactDetails { get; set; }
        public DbSet<Country> Countries { get; set; }
        public DbSet<Equipment> Equipment { get; set; }
        public DbSet<FuelType> FuelTypes { get; set; }
        public DbSet<Location> Locations { get; set; }
        public DbSet<Meeting> Meetings { get; set; }
        public DbSet<Option> Options { get; set; }
        public DbSet<Person> Persons { get; set; }
        public DbSet<VehicleType> VehicleTypes { get; set; }

        // force any DateTime fields to be DateTime2
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Properties<DateTime>()
                .Configure(c => c.HasColumnType("datetime2"));
        }

    } 

此外,我可能应该指出,当我将数据从Sharepoint导入/播种到DB时,我正在另一个项目中执行多种方式的更复杂操作。 所有这些工作。

提供有关我的解决方案结构大致情况的上下文:

  • 具有自己明确关注点的多个项目
  • Foo.EntityFramework包含FooContext配置,Migrations等您的EF内容。
  • Foo.DomainClasses是EntityFramework整个结构所基于的类
  • Foo.Dao.Impl包含执行CRUD的具体对象。 <-代码在这里
  • Foo.SharepointImporter是一个使用EntityFramework _dbContext进行CRUD的项目,所有工作正常,但是并未使用Foo.Dao.Impl。

如果您需要更多信息来进行有根据的猜测,请告诉我这是怎么回事。

评论请求:

  1. @mjwills:“是否在“ return locationItems”命中处设置了断点?-不,它出现在.ToList()

  2. @DavidG:“什么是完整的例外?” -{“未找到具有不变名称'System.Data.SqlClient'的ADO.NET提供程序的实体框架提供程序。请确保该提供程序已在应用程序配置文件的'entityFramework'部分中注册。请参见http://go.microsoft.com/fwlink/?LinkId=260882更多信息。“}-我现在自己并没有更深入地研究Exception,因此我感到有些愚蠢。

2 个答案:

答案 0 :(得分:2)

问题是app.config / web.config不包含EntityFramework的必要配置(无论出于何种原因)。

@ er-sho指出/确认,所有使用EntityFramework的项目都需要对其进行引用。最好在指定的项目上执行Install-Package EntityFramework,这将自动在项目之间生成引用。


说明为什么这不是No Entity Framework provider found for the ADO.NET provider with invariant name 'System.Data.SqlClient'的重复项:

初始状态:

+----------------------+----------------------------+
|       Project        | EntityFramework installed? |
+----------------------+----------------------------+
| Foo.WebService       | no                         |
| Foo.Dao.Impl         | no                         |
| Foo.EntityFramework  | yes                        |
+----------------------+----------------------------+

结果:

  • 未找到具有不变名称'System.Data.SqlClient'的ADO.NET提供程序的实体框架提供程序。确保提供程序已在应用程序配置文件的“ entityFramework”部分中注册。

  • Dao.Impl缺少EntityFramework配置。


将EntityFramework添加到我的DAO层后:

+----------------------+----------------------------+
|       Project        | EntityFramework installed? |
+----------------------+----------------------------+
| Foo.WebService       | no                         |
| Foo.Dao.Impl         | yes                        |
| Foo.EntityFramework  | yes                        |
+----------------------+----------------------------+

结果:

  • 与以前相同的例外,乍一看似乎很奇怪。
  • Dao.Impl现在在app / web.config中具有正确的配置,但是由于WebService是启动项目,因此它仍然缺少必要的配置。

+----------------------+----------------------------+
|       Project        | EntityFramework installed? |
+----------------------+----------------------------+
| Foo.WebService       | yes                        |
| Foo.Dao.Impl         | yes                        |
| Foo.EntityFramework  | yes                        |
+----------------------+----------------------------+

结果:

  • 启动Foo.WebService时,它将读取app.config,为EntityFramework提供所需的必要信息。
  • 工作代码。

我希望这对以后遇到同样问题的人有所帮助。

我感谢每个人的宝贵时间,他们对此进行了评论并引导我寻求解决方案。

答案 1 :(得分:0)

您不需要在Foo.WebService上安装实体框架,只需要在Foo.WebService上添加EF的引用即可。查看this答案和this答案以了解更多详细信息。