首页 新闻 会员 周边 捐助

EF4.1 SaveChange()之后,再查询数据没有更改的问题

0
悬赏园豆:50 [待解决问题]

EF4.1 SaveChange()之后,再查询数据没有更改的问题,

步骤:
1.修改了某个实体
2. SaveChange()成功
3. EF.Set<TSource>().Where("条件");

savechanges成功后数据库中的对应值已经修改了,但第三步得到的返回数据集实体的还是未修改前的值,为何?
怎么在第三步的查询中让修改的值体现出来?

萧笑九州的主页 萧笑九州 | 初学一级 | 园豆:150
提问于:2011-09-29 08:59
< >
分享
所有回答(5)
0

你说的比较笼统,这里有份示例代码,你参考看一下:

public class BlogUser
{
public int BlogUserID { get; set; }
public string BlogName { get; set; }
}

public class BlogDbContext : DbContext
{
public IDbSet<BlogUser> BlogUsers { get; set; }
}
public class EFTest
{
public void Show()
{
using (var db = new BlogDbContext())
{
var blogUser = new BlogUser() { BlogUserID = 4, BlogName = "test" };
db.BlogUsers.Add(blogUser);

//保存记录,返回受影响的行数
int recordsAffected = db.SaveChanges();
Console.WriteLine("追加{0}记录成功", recordsAffected);
}
using (var db = new BlogDbContext())
{
BlogUser bu = db.BlogUsers.Single(b => b.BlogUserID == 4);
Console.WriteLine("修改前值为{0}", bu.BlogName);

bu.BlogName = "cnblogs";
db.SaveChanges();
Console.WriteLine("修改后值为{0}", db.BlogUsers.Single(b => b.BlogUserID == 4).BlogName);
}
}
}

调用:

        static void Main(string[] args)
{
EFTest eft = new EFTest();
eft.Show();
Console.Read();
}

app.config配置:

<configuration>
<connectionStrings>
<add name="BlogDbContext" providerName="System.Data.SqlClient" connectionString="Data Source=.;Initial Catalog=BlogDbContextTest;Integrated Security=True;Pooling=False"/>
</connectionStrings>
</configuration>

运行效果:



要注意的是两个using块不能合在一起写,因为SaveChange并没有立即保存在数据库,你那里出现的错误很可能也是这个原因。

artwl | 园豆:16736 (专家六级) | 2011-09-29 09:59

我也贴点代码:

public class BF
    {
        EquipmentEntities equip = new EquipmentEntities();

        static BF bf;
        public BF GetInstance()
        {
            if(bf == null)
                bf = new BF();

            return bf;
        }


        public bool UpdateOne(TSource ety)
        {
            try
            {
                if (equip.Entry<TSource>(ety).State == EntityState.Modified)
                {
                    equip.SaveChanges();
                    equip.Dispose();
                }
            }
            catch (System.Exception ex)
            {
                
            }
        }

        public IEnumerable<TSource> Query(Func<TSource, bool> func)
        {
                if (func != null)
                    return equip.Set<TSource>().Where(func);
                else
                    return equip.Set<TSource>();
            
        }
    }

    static void Main(string[] args)
    {
        BF bf = BF.GetInstance();
        TSource ety = "修改过的实体";        
        bf.UpdateOne(ety);
        
        //再用bf 做一些其他的事情
        ……
        ……

        //查询
        bf.Query(条件);  //这里查出来的实体集中 ety 的值还是原来的未修改之前的值(数据库中的值已成功修改),为何?

       // ------------------------------------------

        BF bf = new BF();
        TSource ety = "修改过的实体";
        bf.UpdateOne(ety);
        
        //每次再用 new BF() 的对象 做一些其他的事情,
        ……
        ……

        BF bbff = new BF();
        bbff.Query(条件);  //这里查出来的实体集中 ety 的值是改过的,为何?
        
        //----------------------------------------------------------------------------
        //问题总结:用单件模式后,修改的值马上查询,修改值不能反映在结果集中, 为何?

    }

支持(0) 反对(0) 萧笑九州 | 园豆:150 (初学一级) | 2011-09-29 14:35

"要注意的是两个using块不能合在一起写,因为SaveChange并没有立即保存在数据库,你那里出现的错误很可能也是这个原因。" 我测试过了,两个using块可以合在一起啊,SaveChanges 也是立即保存了啊。

支持(0) 反对(0) ChatinCode | 园豆:2272 (老鸟四级) | 2012-04-16 11:47

@萧笑九州: 

equip.SaveChanges();
equip.Dispose();

这个Dispose干什么, 不是捣乱吗? equip 是 DbContext此类吧?

支持(0) 反对(0) ChatinCode | 园豆:2272 (老鸟四级) | 2012-04-16 11:58
0

会不会是实体上有验证特性呢?

传说的青蛙 | 园豆:2 (初学一级) | 2011-10-04 20:44
0

BF.GetInstance();   //GetInstance不是静态方法,能这样访问?
直接声明 public readonly static BF bf= new BF(); 再 BF.bf. 来访问试试

心火 | 园豆:375 (菜鸟二级) | 2011-10-05 11:57
0

save之后重新find一次不就行了。

redspear | 园豆:165 (初学一级) | 2011-12-30 18:22
0

呵呵 我刚学的时候也遇到这个问题了 其实只要在你要显示数据的页面或者Global.asax中Application_Start加上一句话就行了

 Database.SetInitializer<类名(如MovieDBContext)>(null);

就可以了,null表示清空下,重新获取数据库中的数据吧

命若天定-破天 | 园豆:1 (初学一级) | 2012-02-28 08:54

 Database.SetInitialize是那个命名空间的方法呢??

支持(0) 反对(0) nd | 园豆:200 (初学一级) | 2013-11-18 23:38
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册