【问题标题】:Updating context after db modification using a stored procedure使用存储过程修改数据库后更新上下文
【发布时间】:2012-11-27 11:04:34
【问题描述】:

在 Silverlight 应用程序中,我使用存储过程来更新我的数据库表。

ALTER PROCEDURE  [dbo].[SP_ADD_MIS_MISSION] 
(
    @IdMission as int,
    @IdVersion as smallint,
    @LibMission as varchar (50)
)
AS
BEGIN
DECLARE @IDNEWVERSION as int = 1,
        @IDNEWMISSION as int = @IdMission,
        @supp as bit = 1
BEGIN
        IF @IdMission != 0 AND @IdMission is not NULL
        BEGIN
            SELECT @IDNEWVERSION = MAX(IDVERSION)+1 FROM MIS_Mission where MIS_Mission.IdMission=@IdMission

            Update MIS_Mission SET Suppression = @supp WHERE MIS_Mission.IdMission=@IdMission AND MIS_Mission.IdVersion=(@IDNEWVERSION-1)
        END
        ELSE
        BEGIN
            SET @IDNEWVERSION = 1
            select @IDNEWMISSION = MAX(MIS_Mission.IdMission)+1 from MIS_Mission

            if @IDNEWMISSION is NULL SET @IDNEWMISSION=1
        END

        Insert MIS_Mission ( IdMission,
                             IdVersion,
                             LibMission,
                             Suppression
                           )

                    values ( @IDNEWMISSION,
                             @IDNEWVERSION,
                             @LibMission,
                             @Suppression
                           )
        SELECT @IDNEWMISSION
END

我在我的 WCF RIA 服务中添加了这段代码来启动存储过程:

public void SetMission(MIS_Mission mis)
{
    _entity.ADD_MIS_MISSION(mis.IdMission,mis.IdVersion,mis.LibMission);
}

我在我的 Silverlight 应用程序中添加了这段代码,以更新我的数据库,并在我的数据网格中输入值:

private void UpdateMission_Click(object sender, RoutedEventArgs e)
{

    foreach(MIS_Mission mis in dG_Mission.ItemsSource)
    {
        var operation = _Context.SetMission(mis);

        operation.Completed += (se, ev) =>
        {
        };
    }
}

但是当我完成数据库更新时,我的上下文并没有更新 IdVersion 的新值,并且我的数据网格显示了我的任务的旧版本。

如何在不重新加载数据网格的情况下更新上下文?

【问题讨论】:

  • _Context.SetMission(mis); 会触发事件吗?如果是,您需要在调用之前分配operation.Completed += (se, ev) =>。如果不是,您需要触发事件,该事件将在您附加后触发operation.Completed
  • 感谢您的回复。我的operation.Completed += 似乎是这样工作的。当我尝试时,我没有问题。
  • 更新后是否从数据库中检索数据?如果没有,您的应用程序可能不知道您已更新任何内容。如果您不想重新查询数据库,则需要将基础数据存储在List<> 或任何其他结构中,并在每次更新到数据库后重新绑定datagrid。另一种方法是将DataBindingINotifyPropertyChanged 的实现一起使用-使用这种方法,您的UI datagrid 将从底层结构自动更新。
  • 我认为不可能使用INotifyPropertyChanged,因为我的主键在每次更新时都会更改(idmission+idversion)
  • 在这种情况下,遗憾的是,您唯一的选择是在每次更新后重新查询数据库中的数据

标签: wcf c#-4.0 silverlight-4.0 wcf-ria-services


【解决方案1】:

我在这个网站上找到了解决方案:http://weblogs.asp.net/fredriknormen/archive/2009/11/24/refresh-the-cached-entityset-after-a-submitchanges-wcf-ria-services.aspx

我的解决办法是这样的:

private void UpdateMission_Click(object sender, RoutedEventArgs e)
{
    int countenr = itemsSource.Count;

    foreach(MIS_Mission mis in dG_Mission.ItemsSource)
    {
        var operation = _Context.SetMission(mis);

        operation.Completed += (se, ev) =>
        {
            countenr--;
            if (countenr == 0)
            {
                _Context.Load<MIS_Mission>(
                    _Context.ListMissionQuery(),
                    LoadBehavior.RefreshCurrent,
                    loadOperation =>
                    {
                       if (loadOperation.HasError)
                       {
                           MessageBox.Show(loadOperation.Error.Message);
                           loadOperation.MarkErrorAsHandled();
                       }
                       else
                       {
                           List<MIS_Mission> itemsource = dG_Mission.ItemsSource as List<MIS_Mission>;
                           var results = itemsource.Where(entity => !loadOperation.Entities.Contains(entity)).ToList();

                           results.ForEach(entity => itemsource.Remove(entity));

                           results = loadOperation.Entities.Where(entity => !itemsource.Contains(entity)).ToList();

                           results.ForEach(entity => itemsource.Add(entity));

                       }
                   }
                   ,null
               );
            }
        };
    }
}

这个解决方案对我来说很好,但是数据网格的刷新有点慢。

感谢您的帮助 再见

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多