3

我正在使用 EF7 beta3。

在我的数据库上执行两个查询时,如果第一个查询没有返回结果并且包含一个包含,则第二个查询将失败并出现 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

例外是:

EntityFramework.Core.dll 中出现“System.InvalidOperationException”类型的异常,但未在用户代码中处理

附加信息: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);

堆栈跟踪:

在 System.Data.SqlClient.SqlCommand.ValidateCommand(String 方法,布尔异步) 在 System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior,RunBehavior runBehavior,布尔 returnStream,String 方法,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.QueryingEnumerable1.Enumerator.MoveNext() 在 System .Linq.Enumerable.d__8 2.MoveNext() at System.Linq.Enumerable.WhereSelectEnumerableIterator2.MoveNext() 在 Microsoft.Data.Entity.Query.EntityQueryExecutor.EnumerableExceptionInterceptor 1.EnumeratorExceptionInterceptor.MoveNext() at System.Collections.Generic.List1..ctor(IEnumerable 1 collection) at System.Linq.Enumerable.ToList[TSource](IEnumerable1 source) 在 EMFDS.WebApplication.Controllers.HomeController.Index() 在 C:\Users\ nicolas.bourgoin\Documents\Visual Studio 2015\Projects\emfds_dev2\emfds\src\EMFDS.WebApplication\Controllers\HomeController.cs:第 25 行

更新 1

最后,我可以用 MusicStore 重现这个问题。但是,仅当您包含一对多关系(集合)时,它才会引发异常。如果包含多对一关系,则不会引发异常。

4

1 回答 1

0

我回去验证了这是 EF7 的 beta3 版本的问题,但是在当前的开发分支中已经解决了。

于 2015-03-19T21:04:07.907 回答