c# - Entity Framework 中的一对多关系导致异常

标签 c# entity-framework

为了介绍我自己的 Entity Framework ,我创建了一个控制台应用程序来使用它。

有两个实体:ClassAClassB。它们之间是一对多的关系。一个 ClassA 实例可以有多个 ClassB 实例。一个 ClassB 实例有 0 个或 1 个 ClassA 实例。

类的代码是:

public class ClassA {
    public virtual int Id {get; set;}
    public virtual string Name {get; set;}
    public virtual ICollection<ClassB> ClassBs {get; set;}
}

public class ClassB {
    public virtual int Id {get; set;}
    public virtual string Name {get; set;}
    public virtual ClassA ClassA {get; set;}
}

我的数据库上下文和初始化程序的代码是:

public class Context : DbContext {
    public DbSet<ClassA> ClassAs {get; set;}
    public DbSet<ClassB> ClassBs {get; set;}

    protected override void OnModelCreating(DbModelBuilder modelBuilder) {
        modelBuilder.Entity<ClassA>()
            .HasMany(classA => classA.ClassBs)
            .WithRequired(classB => classB.ClassA);
        base.OnModelCreating(modelBuilder);
    }
}

public class Initializer : DropCreateDatabaseAlways<Context> {
    protected override void Seed(Context context) {
        base.Seed(context);
        for (int i = 1; i <= 3; i++) {
            var classA = new ClassA{
                Name = "A-" + i,
                ClassBs = new LinkedList<ClassB>()
            };
            for (int j = 1; j <= 3; j++) {
                var classB = new ClassB{
                    Name = "B-" + i + "-" + j,
                    ClassA = classA
                };
                classA.ClassBs.Add(classB);
                context.ClassBs.Add(classB);
            }
            context.ClassAs.Add(classA);
        }
        context.SaveChanges();
    }
}

我的主要方法是:

    static void Main(string[] args) {
        Database.SetInitializer(new Initializer());

        Context db = new Context();

        foreach (var classA in db.ClassAs) {
            Console.WriteLine(classA.Name);
            foreach (var classB in classA.ClassBs)
                Console.WriteLine("\t" + classB.Name);
        }

        Console.Write("\nFIN");
        Console.ReadKey();
    }

当 Main 方法中的第二个 foreach 循环开始时,抛出以下异常:

System.Data.EntityCommandExecutionException was unhandled
  Message=An error occurred while executing the command definition. See the inner exception for details.
  Source=System.Data.Entity
  InnerException: System.InvalidOperationException
       Message=There is already an open DataReader associated with this Command which must be closed first.
       Source=System.Data
       StackTrace:
            at System.Data.SqlClient.SqlInternalConnectionTds.ValidateConnectionForExecute(SqlCommand command)
            at System.Data.SqlClient.SqlConnection.ValidateConnectionForExecute(String method, SqlCommand command)
            at System.Data.SqlClient.SqlCommand.ValidateCommand(String method, Boolean async)
            at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
            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(CommandBehavior behavior)
            at System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior)

ClassA 中的 ClassBs 属性似乎没有正确加载。但是我确实在上下文中指定了 ClassA 有很多 ClassB

数据库连接似乎正常,因为 ClassA 的第一个实例显示在控制台上。我还可以在 Visual Studio 中访问数据库并查看在初始化程序中生成的数据。

我使用了 training videos of ASP.NET MVC开始使用此控制台应用程序。

你知道出了什么问题吗?

最佳答案

您需要将连接字符串中的 multipleactiveresultsets 设置为 true。

MultipleActiveResultSets=true;

关于c# - Entity Framework 中的一对多关系导致异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9534227/

相关文章:

sql-server - 使用用户通过 Entity Framework 提供的 XPath 查询 SQL Server xml 列

c# - 邀请用户成为成员(member)

c# - 商务/假日日期处理

c# - 如何与Windows服务通信?

c# - Asp.net core + EF Code优先,迁移不同项目中的文件

entity-framework - 将存储过程的返回类型设置为自动 - 使用 Entity Framework 生成

c# - 使用约束 delaunay 三角剖分对多边形进行三角剖分

c# - 在单个按钮上协调多个 IObservable

c# - 我怎样才能使 Byte[] 可以为空

c# - ef6 include() 用于具有必需属性的可空属性