Linq中的更新

最近在做一个小例子时,发现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内,封装了一个类似缓存的对象,来存放数据。即使修改了原数据,但这种状态没有触发缓存的修改(不知道在这里,微软是怎么封装的或思考的)。

为了解决这些所有的问题,只有在整个项目的处理中,定义一个数据库对象,来完成数据的处理,这样就能保持数据的一至性了。

















本文转自桂素伟51CTO博客,原文链接:http://blog.51cto.com/axzxs/393417 ,如需转载请自行联系原作者



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值