使用不产生结果的Include将关闭阅读器

时间:2015-03-19 14:37:11

标签: c# asp.net-core entity-framework-core

我正在使用EF7 beta3。

在我的数据库上执行两个查询时,如果第一个查询没有返回结果且包含include,则第二个查询将因System.InvalidOperationException而失败。我无法在MusicStore中重现该问题,也无法弄清楚我的代码中是什么造成了这个问题。

抛出异常:

var db = new EmfdsContext();
var user = db.Users.Include(x => x.Logins).FirstOrDefault(x => x.UserName == "nonExistantUserName");
var role = db.Roles.Where(x => x.Name == "Subscriber").ToList(); //throws

不会抛出异常:

var db = new EmfdsContext();
var user = db.Users.FirstOrDefault(x => x.UserName == "nonExistantUserName");
var role = db.Roles.Where(x => x.Name == "Subscriber").ToList(); //doesn't throw

不会抛出异常:

var db = new EmfdsContext();
var user = db.Users.Include(x => x.Logins).FirstOrDefault(x => x.UserName == "existantUserName");
var role = db.Roles.Where(x => x.Name == "Subscriber").ToList(); //doesn't throw

例外是:

  

类型' System.InvalidOperationException'的例外情况发生在EntityFramework.Core.dll中但未在用户代码中处理

     

其他信息:ExecuteReader需要一个开放且可用的连接。连接的当前状态已关闭。

登录包含无关紧要,它可以是包含中的任何其他关系,它将抛出异常。

相关映射:

builder.Entity<Subscriber>().ForRelational().Table("Subscribers", "ApplicationServices");
builder.Entity<Subscriber>().Key(s => s.Id);
builder.Entity<Subscriber>().HasMany(s => s.SubscriberGroups).WithOne(sg => sg.Subscriber).ForeignKey(sg => sg.Subscriber_Id);
builder.Entity<Subscriber>().HasMany(s => s.Roles).WithOne().ForeignKey(ur => ur.UserId);

builder.Entity<Role>().ForRelational().Table("Roles", "ApplicationServices");
builder.Entity<Role>().Key(r => r.Id);
builder.Entity<Role>().HasMany(r => r.Users).WithOne().ForeignKey(ur => ur.RoleId);
builder.Entity<Role>().HasMany(r => r.MenuRoles).WithOne(mr => mr.Role).ForeignKey(mr => mr.Role_Id);

堆栈跟踪:

  

at System.Data.SqlClient.SqlCommand.ValidateCommand(String method,Boolean async)      在System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior,RunBehavior runBehavior,Boolean returnStream,String method,TaskCompletionSource 1 completion, Int32 timeout, Task& task, Boolean asyncWrite) at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method) at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior) at System.Data.Common.DbCommand.ExecuteReader() at Microsoft.Data.Entity.Relational.Query.QueryingEnumerable 1.Enumerator.MoveNext()      在System.Linq.Enumerable.d__8 2.MoveNext() at System.Linq.Enumerable.WhereSelectEnumerableIterator 2.MoveNext()      at Microsoft.Data.Entity.Query.EntityQueryExecutor.EnumerableExceptionInterceptor 1.EnumeratorExceptionInterceptor.MoveNext() at System.Collections.Generic.List 1..ctor(IEnumerable 1 collection) at System.Linq.Enumerable.ToList[TSource](IEnumerable 1 source)      在C:\ Users \ nicolas.bourgoin \ Documents \ Visual Studio 2015 \ Projects \ emfds_dev2 \ emfds \ src \ EMFDS.WebApplication \ Controllers \ HomeController.cs:第25行中的EMFDS.WebApplication.Controllers.HomeController.Index()中

更新1

最后,我可以使用MusicStore重现此问题。但是,它只会在包含一对多关系(集合)时抛出异常。如果包含多对一关系,则不会抛出异常。

1 个答案:

答案 0 :(得分:0)

我回去确认这是EF7 beta3版本的一个问题,但它已在当前的开发分支中得到解决。