首页新闻找找看学习计划

关于EntityFramework添加后查询的问题

0
悬赏园豆:50 [已解决问题] 解决于 2014-01-16 17:47

先上代码:

以下是两个Model:

    [Serializable]
    public class ProjectInfo
    {
        [Key]
        public int Id { get; set; }                     //id 主键
        public string SysModuleId { get; set; }           //所属目录 外键
        public int DesignerId { get; set; }             //Designer表外键DesignerId
        public string ProjectName { get; set; }         //项目名称
        public string Describe { get; set; }            //描述
        public DateTime InputTime { get; set; }         //录入时间
        public int Sort { get; set; }                   //排序 默认0
        public int Hot { get; set; }                    //热门  默认0
        public int Top { get; set; }                    //首页 默认0

        public virtual Designer Designer { get; set; }
    }
    [Serializable]
    public partial class Designer
    {
        [Key]
        public int Id { get; set; }                     //id 主键
        public string RealName { get; set; }            //姓名
        public string HeadPortrait { get; set; }        //头像
        public string Position { get; set; }            //职位
        public int Sex { get; set; }                    //性别
        public DateTime DateOfBirth { get; set; }       //出生日期
        public string Testimonials { get; set; }        //获奖
        public string Diploma { get; set; }             //教育背景
        public string Introduction { get; set; }        //个人介绍
        public string Remark { get; set; }              //备注
        public DateTime InputTime { get; set; }         //数据录入时间
        public int Sort { get; set; }                   //排名

        public virtual ICollection<ProjectInfo> ProjectInfoes { get; set; }
    }

以下是添加和分页查询的方法:

        public bool AddEntity(T entity)
        {
            m_DbContext.Set<T>().Add(entity);
            m_DbContext.Entry<T>(entity).State = EntityState.Added;
            return m_DbContext.SaveChanges() > 0;
        }
        public IQueryable<T> GetPageEntity<S>(int pageSize, int pageIndex, out int total, Func<T, bool> whereLambda, bool isAsc, Func<T, S> orderByLambda)
        {
            var temp = m_DbContext.Set<T>().Where<T>(whereLambda);
            total = temp.Count();
            //排序获取当前页的数据
            if (isAsc)
            {
                return
                    temp.OrderBy<T, S>(orderByLambda)
                        .Skip<T>(pageSize * (pageIndex - 1))
                        .Take<T>(pageSize).AsQueryable();
            }
            else
            {
                return
                    temp.OrderByDescending<T, S>(orderByLambda)
                      .Skip<T>(pageSize * (pageIndex - 1))
                      .Take<T>(pageSize).AsQueryable();
            }
        }

需求非常简单就是在集合页面显示出Designer的RealName,但是发现添加一条ProjectInfo数据以后,不能显示RealName,如图:

最上面那条数据是新添加的。

调试发现新添加的数据类型和本来有的数据查询后的类型有些不一样如图:

实在找不到原因,请大家帮帮忙。如果问题写的不太明白,请加我QQ362965772,不甚感激!

CoderZ的主页 CoderZ | 初学一级 | 园豆:136
提问于:2014-01-16 10:04
< >
分享
最佳答案
0

调试发现新添加的数据类型和本来有的数据查询后的类型

ef查出来的数据类型是 原来类型的一个代理类型,一个临时对象。

不知道为啥 没有RealName字段,但是发现以下问题


1.楼主的 GetPageEntity 分页方法里 为何有  SaveChanges提交?

2.GetPageEntity 的参数是Func<T, bool> 而不是 Expression<Func<T,bool>>,有没有跟踪sql语句,是否正常?

收获园豆:30
Qlin | 老鸟四级 |园豆:2403 | 2014-01-16 11:07

谢谢你的回答,分页方法里的SaveChanges是当时我调试时添加的本不应该有,忘记删了不好意思。

是这样的,新添加的ProjectInfo数据,如果是选择的Designer是原本集合页面出现过的,那一切正常。如果选择的是一个新的Designer(原集合页面没加载过)那么就会出现上面的问题。怀疑是EF内存加载的时候有些问题我没有搞清楚。有一种方法可以解决就是添加ProjectInfo之前先通过DesignerID把Designer查出来,然后再添加。(个人怀疑是把这个Designer加载到了内存中)但是这么做感觉不妥。初学EF,应该是我对EF的理解还不到位。望指教,3Q~

CoderZ | 园豆:136 (初学一级) | 2014-01-16 11:34
其他回答(4)
0

如果你想通过EF忘了SQL,那么我告诉你:这是致命的.

坑多、性能欠佳、
多数据源及多数数据库变动支持不是很方便.

 

收获园豆:10
月明时勤 | 园豆:746 (小虾三级) | 2014-01-16 10:20
0

完全不知道你遇到什么问题。、

但关于运行时实体类型不一样,那是因为ef会从实体类派生出一个子类,这个子类实现了导航属性和上下文追踪等功能所需的方法

如果你通过ef获得一个实体,或者是将一个实体放入ef上下文追踪时,他会用将实体类转为子类来使用。所以你在调试时看到的类名后面会加上一段乱七八糟的东西

收获园豆:10
吴瑞祥 | 园豆:28731 (高人七级) | 2014-01-16 10:27
0

终于解决了,看了一下贪婪加载.初学EF还是对它不够了解,继续学习吧...

CoderZ | 园豆:136 (初学一级) | 2014-01-16 17:46
0

请问楼主怎么解决的?我也遇到差不多的问题

laidanchao | 园豆:186 (初学一级) | 2017-05-08 13:34
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册