在实体对象中访问导航属性里的属性值出现异常“There is already an open DataReader associated with this Command which must be closed first”

在实体对象中访问导航属性里的属性值出现异常“There is already an open DataReader associated with this Command which must be closed first”。

public class User
    {
        public long UserId { get; set; }
        public string UserName { get; set; }
        public string UserPwd { get; set; }
        public DateTime UserCreateDate { get; set; }
        public DateTime LastLoginDate { get; set; }
        public DateTime LastActivityDate { get; set; }
        public int UserRoleId { get; set; }

        public virtual UserProfile UserProfile { get; set; }
    }
public class UserProfile
    {
        [Key, ForeignKey("User")]
        public long UserId { get; set; }
        public int Gender { get; set; }
        public string NickName { get; set; }
        public string Signature { get; set; }
        public string Intro { get; set; }
        public DateTime? Birth { get; set; }
        public string Location { get; set; }
        public string Website { get; set; }
        public string Qq { get; set; }
        public string WeiBo { get; set; }
        public string Medals { get; set; }
        public string Phone { get; set; }
        public string Email { get; set; }
        public bool IsSendEmail { get; set; }

        public virtual User User { get; set; }
    }

如果有User的对象,想访问自己的UserProfile里的属性值,直接访问会出现异常。

例如

@p.UserName   //ok
@p.UserProfile.Intro   //出现异常

异常为There is already an open DataReader associated with this Command which must be closed first。

导航属性UserProfile采用的是延迟加载(惰性加载),在访问它的时候才加载。在读对象自己的属性值时已经打开了一个DataReader,然后在访问到延迟加载的导航属性时,又需要DataRead来读取这个导航属性中的各个属性值,而前一个DataReader还没有关闭。

解决的办法是采用多数据结果集。

多数据结果集(Multiple Active Result Sets,简称MARS)-它允许在单个连接上执行多重的数据库查询或存储过程。这样的结果是,你能够在单个连接上得到和管理多个、仅向前引用的、只读的结果集。可以在一个Command对象上同时打开多个DataReader,节约数据库联接所耗费的服务器资源。

在数据库的连接字符串上添加MultipleActiveResultSets=true

<add name="CRGDatabase" connectionString="Data Source=./;Initial Catalog=DB;uid=User;pwd=Pwd;MultipleActiveResultSets=true;" providerName="System.Data.SqlClient"/>

时间: 2024-10-10 04:04:03

在实体对象中访问导航属性里的属性值出现异常“There is already an open DataReader associated with this Command which must be closed first”的相关文章

在XSL中定义HTML标签里的属性使用XSL的值

如何在XSL中定义HTML标签里的属性使用XSL的值?? [xml] <?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="exam.xsl"?> <test> <test_type>exam</test_type> <testid id="1"> <say>什么事情啊?<

判断JSON返回的对象中的firstName这一列的值是否包含指定的字符

判断JSON返回的对象中的firstName这一列的值是否包含指定的字符,如果包含指定字符则返回true,否则返回false 标签: <无> 代码片段(1)[全屏查看所有代码] 1. [代码][其他]代码 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51

关于MultipleActiveResultSets属性导致的There is already an open DataReader associated with this Command which must be closed first的解决方法

执行SqlDataReader.Read之后,如果还想用另一个SqlCommand执行Insert或者Update操作的话,会得到一个错误提示:There is already an open DataReader associated with this Command which must be closed first.,然后一般就会产生数据保存失败的异常. 解决方法是在ConnectionString中加上一个参数“MultipleActiveResultSets”, 将其值设置为tru

ng-repeat 嵌套访问父作用域里的属性

在一个项目中,需要嵌套循环输出一个二维表的里的数据 数据结构 [ { id:1, list:[ { id:1, name:'li' } ] }, { id:2, list:[ { id:1, name:'ming' } ] } ] 模板页 <div ng-repeat="c in obj"> <div ng-repeat="a in c.list"> <span ng-if="$first"> {{$paren

Drools规则引擎-如果判断某个对象中的集合是否包含指定的值

规则引擎集合相关处理 在实际生产过程中,有很多关于集合的处理场景,比如一个Fact对象中包含有一个集合,而需要判断该集合是否包含某个值.而Drools规则引擎也提供了多种处理方式,比如通过from.contains.exists等进行操作,比较. 当然也可以通过function函数来做相应的比较,在个在其他章节讲到过,就不在此赘述.下面重点以几个实例才进行讲解,在具体实践中根据具体情况来进行运用. 实例 省略掉基本的配置,直接看调用代码和规则代码. 测试调用代码: public class Co

在实体类中对与记录数量的属性进行修改时,定义相关方法在实体类中,进行修改时方便

在demo.java中有一个private  Integer count;属性,需要对这个属性进行加一和减一 private Integer count; public Integer getCount() { return count; } public void setCount(int count) { this.count = count; } //对属性加一,先判断是否为null,当创建的是新的对象时,对属性加一就可以先设为0,然后加一,不用在再代码中进行判断 public int a

flask学习(十):模板中访问模型和字典的属性

访问模型中的属性或者是字典,可以通过{{params.property}}的形式,或者是使用{{params['age']}}这样的形式 原文地址:https://www.cnblogs.com/cnhkzyy/p/9690688.html

【ASP.NET】DataContract序列化,反序列化对象中包含用接口声明的属性时的处理方法

为此对象添加KnownType属性(Attribute).类型为用接口声明的属性(Property)的所有可能类型. 示例如下: 1 public interface IKey 2 { 3 [DataMember] 4 int Id { get; set; } 5 6 [DataMember] 7 string Name { get; set; } 8 } 9 10 [DataContract] 11 public abstract class KeyBase : IKey 12 { 13 [D

关于数据库(SqlServer)中替换xml文件里面的value值

declare @xmlDoc xml declare @PrintValue nvarchar(max) select @xmlDoc=DESCRIPTION from dbo.WF_PERSIST_DESCRIPTOR where [PROCESS_ID]='1e9e9059-50ea-adac-4660-918cd54e3436'  --将数据中的数据读取出来,数据库里面报错的是nvarchar(max)这里可以直接转换 set @xmlDoc.modify('replace value