Linq中的更新
时间:2010-09-18 来源:桂素伟
最近在做一个小例子时,发现Linq To Sql一个问题,先描述一下场景。
应用数据库DataContext对象时,实例化了两上对象,一个对象来完成增,删,改,别一个对象来完成查询。
代码(代码是在Winform中完成的)如下:
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
int id;
ComEntDataContext cedc = new ComEntDataContext();//查询数据库对象
ComEntDataContext cedc1 = new ComEntDataContext();//增删改数据库对象
//查询方法
private void button2_Click(object sender, EventArgs e)
{
//dataGridView1.DataSource = cedc.Users.Select(s => s);
dataGridView1.DataSource = cedc.Users;
cedc.Connection.Close();
listBox1.Items.Clear();
foreach (Users use in cedc.Users)
{
listBox1.Items.Add(use.username);
}
}
//修改方法
private void button1_Click(object sender, EventArgs e)
{
try
{
Users User = cedc1.Users.Single(user => user.ID == id);
User.username = DateTime.Now.ToString("hhmmss");
cedc1.SubmitChanges();
}
catch
{ }
}
//添加方法
private void button3_Click(object sender, EventArgs e)
{
try
{
Users use = new Users();
use.username = "sss";
use.userpw = "222";
cedc1.Users.InsertOnSubmit(use);
cedc1.SubmitChanges();
}
catch
{ }
}
//删除方法
private void button4_Click(object sender, EventArgs e)
{
try
{
Users User = cedc1.Users.Single(user => user.ID == id);
cedc1.Users.DeleteOnSubmit(User);
cedc1.SubmitChanges();
}
catch
{ }
}
private void Form2_Load(object sender, EventArgs e)
{
dataGridView1.CellClick += new DataGridViewCellEventHandler(FF);
}
public void FF(object sender, DataGridViewCellEventArgs e)
{
if (e.RowIndex > -1)
{
id = Convert.ToInt16(dataGridView1.Rows[e.RowIndex].Cells[0].Value);
}
}
}
代码dataGridView1.DataSource = cedc.Users;是用来绑定数据到datagridview上的,第一次绑定没有问题,如果我们执行了添加或删除后,再查询的时候就不起作用了。我们启用SQL的跟踪,会发现,每次点击查询时,是有sql语句提效的,增加,修改,删除代码后,再查询,依然能跟踪到有查询的执行,但查询的结果不变。
如果把红色代码//dataGridView1.DataSource = cedc.Users.Select(s => s);解除注释,会发现,情况有所改变,添加,删除的数据会在再次查询时能查到,但修改查询不到(数据库中的数据是发生了变化的)。
上面的两种情况,都至少说明一点,当再次查询,其实是执行了数据的查询,因为用SQL Server Profiler已经跟踪到了查询语句,只不过这种变化没有加载到显示控件上,应该在Linq To Sql内,封装了一个类似缓存的对象,来存放数据。即使修改了原数据,但这种状态没有触发缓存的修改(不知道在这里,微软是怎么封装的或思考的)。
为了解决这些所有的问题,只有在整个项目的处理中,定义一个数据库对象,来完成数据的处理,这样就能保持数据的一至性了。
相关阅读 更多 +