Winforms DataContext.GetChangeSet显示更新,但不显示插入

Winforms DataContext.GetChangeSet显示更新,但不显示插入,winforms,linq-to-sql,datacontext,Winforms,Linq To Sql,Datacontext,我使用LINQtoSQL和存储过程来查询一个简单的数据库。在我的表单上,我有一个datagridview,其中包含一些查询字段的控件。用户键入街道名称/编号/方向等,然后在数据网格中返回结果。网格使用bindingSource和bindingNavigator来获得结果。我可以导航,从DAL中以列表的形式返回结果,并调用运行良好的更新存储过程。但是,当我使用内置命令添加新记录时,它成功地将该记录添加到网格中,但是当我尝试在DataContext的DAL中使用GetChangeSet时,我显示了0

我使用LINQtoSQL和存储过程来查询一个简单的数据库。在我的表单上,我有一个datagridview,其中包含一些查询字段的控件。用户键入街道名称/编号/方向等,然后在数据网格中返回结果。网格使用bindingSource和bindingNavigator来获得结果。我可以导航,从DAL中以列表的形式返回结果,并调用运行良好的更新存储过程。但是,当我使用内置命令添加新记录时,它成功地将该记录添加到网格中,但是当我尝试在DataContext的DAL中使用GetChangeSet时,我显示了0个插入

因此,DataContext正在跟踪我对现有记录的更改,但没有看到任何添加的记录。我在DAL中使用私有静态datacontext。我想问题是如何添加新记录并将其传递到我的存储过程方法??我看不到任何从bindingsource获取添加记录的方法,或者如何使用网格查看是否需要添加新记录

UI/表单中调用我的DAL的代码

private void btnSearch_Click(object sender, EventArgs e)
    {
        // Call search query
        spSearchCardsResultBindingSource.DataSource = 
            SideSewer.QueryCards(permit:txtPermit.Text, 
            parcel: txtParcel.Text, streetNum: nullNum1,
            streetNum2: nullNum2, streetDirection: cbDirection.Text, 
            streetName: txtName.Text, streetType: cbType.Text,
            inspected: inspectedNull, includeAliases: ckbxAlias.Checked);
    }

    private void saveToolStripButton_Click(object sender, EventArgs e)
    {
        // This line below actually WORKS, yet it just adds the record 
        // user currently has selected may NOT be the NEW one!!
        SideSewer.InsertData((PermitInfo)spSearchCardsResultBindingSource.Current);

        if (!SideSewer.save())
            MessageBox.Show("There was a problem saving the record(s)");
    }
下面是查询记录和执行保存的代码。保存用于更新,但每当我在网格中添加记录时,它就会将其添加到PermitInfo列表中,但不会显示在GetChangeSet中

private static SideSewerDataContext _dc = new SideSewerDataContext();

public static List<PermitInfo> QueryCards(string permit = null, 
string parcel = null, int? streetNum = null, int? streetNum2 = null, 
string streetDirection = null,string streetName = null, 
string streetType = null,DateTime? inspected = null, bool? includeAliases = null)
{
    try
    {
        return dc.spSearchCards(permit, parcel, streetNum, streetNum2, 
        streetDirection, streetName, streetType, inspected, includeAliases).ToList();
        }
        catch (SqlException ex)
        {
            MessageBox.Show("Error: " + ex.Message,"Error Occured!",MessageBoxButtons.OK,MessageBoxIcon.Error);
            return null;
        }
    }

    public static bool save()
    {

        ChangeSet cs = _dc.GetChangeSet();

        try
        {
            foreach (var obj in cs.Updates)
            {
                if (obj is PermitInfo)
                {
                    PermitInfo pInfo = (PermitInfo)obj;
                    _dc.spUpdatePermitInfo(pInfo.ID, pInfo.Permit, pInfo.Parcel, pInfo.StreetNumber, pInfo.StreetNumberSuffix, pInfo.StreetDirection, pInfo.StreetName, pInfo.StreetType, pInfo.Inspected, Environment.UserName.ToUpper());
                }
            }
            foreach (var obj in cs.Inserts)
            {
                if (obj is PermitInfo)
                {
                    PermitInfo pInfo = (PermitInfo)obj;
                    _dc.spInsertPermitInfo(Environment.UserName.ToUpper(), pInfo.Permit, pInfo.Parcel, pInfo.StreetNumber, pInfo.StreetNumberSuffix, pInfo.StreetDirection, pInfo.StreetName, pInfo.StreetType, pInfo.Inspected);
                }
            }
            return true;
        }
        catch (Exception ex)
        {
            System.Windows.Forms.MessageBox.Show(ex.Message);
            return false;
        }
    }

提前感谢所有看到这一点的人,他们可以让我了解我做错了什么,或者如何去做我需要完成的事情

为什么要手动执行此操作?您可以在DataContext上调用.SubmitChanges。我有一些历史记录/日志记录表,因此当任何人删除/插入/更新记录时,我存储的进程也会将记录添加到这些表中,对于environment.username等字段,我在实体行为中看不到任何方式将存储的进程绑定到insert,而是使用environment.username等变量,因此,我使用所需的参数手动调用存储的过程。我注意到,如果将DataGridView.DataSource设置为BindingSource,然后将BindingSource.DataSource设置为从DAL返回的IList,则它将不起作用。如果我只是设置从DAL返回的DataGridView.DataSource=IList,它将插入我添加的行。。。