EF4.1 SaveChange()之后,再查询数据没有更改的问题,
步骤:
1.修改了某个实体
2. SaveChange()成功
3. EF.Set<TSource>().Where("条件");
savechanges成功后数据库中的对应值已经修改了,但第三步得到的返回数据集实体的还是未修改前的值,为何?
怎么在第三步的查询中让修改的值体现出来?
你说的比较笼统,这里有份示例代码,你参考看一下:
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并没有立即保存在数据库,你那里出现的错误很可能也是这个原因。
我也贴点代码:
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 的值是改过的,为何?
//----------------------------------------------------------------------------
//问题总结:用单件模式后,修改的值马上查询,修改值不能反映在结果集中, 为何?
}
"要注意的是两个using块不能合在一起写,因为SaveChange并没有立即保存在数据库,你那里出现的错误很可能也是这个原因。" 我测试过了,两个using块可以合在一起啊,SaveChanges 也是立即保存了啊。
@萧笑九州:
equip.SaveChanges();
equip.Dispose();
这个Dispose干什么, 不是捣乱吗? equip 是 DbContext此类吧?
会不会是实体上有验证特性呢?
BF.GetInstance(); //GetInstance不是静态方法,能这样访问?
直接声明 public readonly static BF bf= new BF(); 再 BF.bf. 来访问试试
save之后重新find一次不就行了。
呵呵 我刚学的时候也遇到这个问题了 其实只要在你要显示数据的页面或者Global.asax中Application_Start加上一句话就行了
Database.SetInitializer<类名(如MovieDBContext)>(null);
就可以了,null表示清空下,重新获取数据库中的数据吧
Database.SetInitialize是那个命名空间的方法呢??