实体框架何时实际调用数据库

时间:2015-04-10 14:26:15

标签: c# entity-framework

我在这里读过其他一些帖子,但我不确定我是否已经相当满意......

采取以下措施:

class Whatever
{
        /// <summary>
        /// Messages can relate to messages through replies
        /// </summary>
        public virtual IList<FieldMessage> FieldMessages { get; set; }

        [NotMapped]
        public int UnreadMessageCount
        {
            get
            {
                if( this.FieldMessages == null )
                {
                    return 0;
                }

                return this.FieldMessages.Where(x => x.Read == false).Count();
            }
        }
}

这是一个实体框架类......

我的问题:

  1. 实体框架是否会延迟加载那些virtual IList properties或者在执行此操作之前调用它?
  2. 当你在你的视野中,并且你在Whatever对象列表上做了一个循环...并且每个循环都调用UnreadMessageCount ...我注意到在if语句中,{ {1}}占用整个6300 entires,我可以在调试时查看,然后this.FieldMessages语句得到计数......它真的这样做吗?或者只是因为我正在调试它?
  3. 你有一篇很好的文章关于当地实体框架实际上是在进行数据库调用吗...我需要避免内存被填满,因为这个网站会被成千上万的消息一直用到。

1 个答案:

答案 0 :(得分:1)

尝试使用集合时会立即进行查询:调用Count属性,使用IEnumerable扩展方法或foreach进行迭代,...)。整个集合将在首次使用时加载,然后集合将保留在上下文中。

在调试器中尝试读取值时,将调用集合的方法并查询数据库。

如果FieldMessages包含6300个条目,那么您应该避免在Whatever类上声明收集。使用上下文和FieldMessage的{​​{1}}查询附加到具有未读状态的特定DbSet实例的未读邮件。