Linq to SQL记录没有更新

时间:2012-10-09 11:40:54

标签: c# linq-to-sql

我正在尝试从表中获取记录列表,然后在foreach循环中逐一尝试update记录。

这是我的代码

     public IEnumerable<MessageOut> GetSMSInformation()
        {
            using (var db = new DataClasses1DataContext())
            {
                var sms = db.MessageOuts.Where(msg => msg.msgstatus.Equals("Pending")).Select(msg => msg);
                return sms.ToList();
            }
        }



     public void StartSMSSending()
        {
            var information = GetSMSInformation();

            foreach (var sms in information)
            {
                SendSMS(sms.reciever, sms.msg);
                UpdateRecords(sms,"Delivered", DateTime.Now);
            }
        }

   public void UpdateRecords(MessageOut sms, string msgStatus, DateTime sentTime)
        {
            using (var db = new DataClasses1DataContext())
            {
                sms.msgstatus = msgStatus;
                sms.senttime = sentTime;
                db.SubmitChanges();
            }
        }

记录不会更新。我也没有收到任何错误。

有人可以帮我解决这个问题吗?

3 个答案:

答案 0 :(得分:7)

为了使用Linq2Sql类执行更新操作,您需要保持上下文的活动状态。在上面的示例中,您将选择包含在using语句中,以便返回记录,然后转储上下文。当您进行更新时,会有一个新的上下文,因此没有注册对象的更改。执行此操作的方法可以是将上下文设置为更全局的对象,或将其作为参数传递。

public IEnumerable<MessageOut> GetSMSInformation(DataContext context)
{
    var sms = context.MessageOuts.Where(
        msg => msg.msgstatus.Equals("Pending")).Select(msg => msg);
    return sms.ToList();
}

public void StartSMSSending()
{
    using (var db = new DataClasses1DataContext())
    {
        var information = GetSMSInformation(db);

        foreach (var sms in information)
        {
            SendSMS(sms.reciever, sms.msg);
            UpdateRecords(sms,"Delivered", DateTime.Now, db);
        }
    }
}

public void UpdateRecords(MessageOut sms, string msgStatus, DateTime sentTime, DataContext context)
{
    sms.msgstatus = msgStatus;
    sms.senttime = sentTime;
    context.SubmitChanges();
}

或者,你可以这样做(我的首选方法):

public IEnumerable<MessageOut> GetSMSInformation()
{
    var sms = Context.MessageOuts.Where(
        msg => msg.msgstatus.Equals("Pending")).Select(msg => msg);
    return sms.ToList();
}

public void StartSMSSending()
{
    var information = GetSMSInformation(db);

    foreach (var sms in information)
    {
        SendSMS(sms.reciever, sms.msg);
        UpdateRecords(sms,"Delivered", DateTime.Now, db);
    }
}

public void UpdateRecords(MessageOut sms, string msgStatus, DateTime sentTime)
{
    sms.msgstatus = msgStatus;
    sms.senttime = sentTime;
    Context.SubmitChanges();
}

private DataClasses1DataContext _context = null;
public DataClasses1DataContextContext
{
    get
    {
        return _context ?? (_context = new DataClasses1DataContext());
    }
}

答案 1 :(得分:3)

您正在从此DB上下文中提取数据:

    public IEnumerable<MessageOut> GetSMSInformation()
    {
        using (var db = new DataClasses1DataContext())
        {
            var sms = db.MessageOuts.Where(msg => msg.msgstatus.Equals("Pending")).Select(msg => msg);
            return sms.ToList();
        }
    }

然后,如果要将更改提交到其他DB上下文,则要更新先前数据库上下文中的数据:

    public void UpdateRecords(MessageOut sms, string msgStatus, DateTime sentTime)
    {
        using (var db = new DataClasses1DataContext())
        {
            sms.msgstatus = msgStatus;
            sms.senttime = sentTime;
            db.SubmitChanges();
        }
    }

将数据库上下文作为参考或最佳保持为您的班级成员。这确保了类实例的单个db上下文实例。

我的建议如下:

class SmsCenter
{
        private DataClasses1DataContext _dbContext;

        public SmsCenter()
        {
            _dbContext = new DataClasses1DataContext();
        }

        public IEnumerable<MessageOut> GetSMSInformation()
        {
            var sms = _dbContext.MessageOuts.Where(msg => msg.msgstatus.Equals("Pending")).Select(msg => msg);
            return sms.ToList();
        }



        public void StartSMSSending()
        {
            var information = GetSMSInformation();

            foreach (var sms in information)
            {
                SendSMS(sms.reciever, sms.msg);
                UpdateRecords(sms,"Delivered", DateTime.Now);
            }
        }

        public void UpdateRecords(MessageOut sms, string msgStatus, DateTime sentTime)
        {
            sms.msgstatus = msgStatus;
            sms.senttime = sentTime;
            _dbContext.SubmitChanges();
        }
}

答案 2 :(得分:1)

你没有关联&#34; sms&#34; db的对象,如

            sms.msgstatus = msgStatus;
            sms.senttime = sentTime;
            db.MessageOut.Add(sms);
            //or
            db.MessageOut=sms;
            db.SubmitChanges();