实体数据模型& DataGridView - 创建新对象

时间:2010-03-30 18:33:13

标签: vb.net winforms linq entity-framework .net-3.5

我对EDM很新,所以请耐心等待。我有一个窗体,其上有一个DataGridView,它与我创建的EDM绑定。我想出了如何更新我的更改,但是当用户创建一个我遇到问题的新行时。

我尝试了很多方法和许多谷歌搜索,但到目前为止没有任何结果。

以下是数据的加载方式:

    Dim boilerID As Integer = DirectCast(ddlBoiler.SelectedValue, Integer)
    Dim countryID As Integer = DirectCast(ddlCountry.SelectedValue, Integer)

    Dim ratings = From r In _Context.Rating _
                 Where r.Boiler.Boiler_ID = boilerID _
                 And r.Country.Country_ID = countryID _
                 Order By r.Sequence _
                 Select r

    RatingBindingSource.DataSource = ratings.ToList()

此外,我现在正在做的就是保存信息:

Private Sub btnSave_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnSave.Click
    _Context.SaveChanges()
End Sub

我希望用户能够使用网格的“新行”功能将新项目添加到数据库,而不必单击按钮并打开新对话框。这将如何实现?

如果有人需要,我可以提供一些我尝试添加新项目的方法。

谢谢!

更新:这是我尝试添加新对象的方法之一,以及我收到的错误:

    For Each dgvr As DataGridViewRow In dgvRatings.Rows
        If dgvr.DataBoundItem IsNot Nothing AndAlso CType(dgvr.DataBoundItem, Rating).Rating_ID <= 0 Then

            Dim r As Rating = dgvr.DataBoundItem
            r.Boiler = ddlBoiler.SelectedItem
            r.Country = ddlCountry.SelectedItem

            _Context.AddObject("Rating", r)
        End If
    Next

错误(调用_Context.SaveChanges()时发生):存储更新,插入或删除语句影响了意外的行数(0)。自实体加载后,实体可能已被修改或删除。刷新ObjectStateManager条目。

2 个答案:

答案 0 :(得分:2)

你需要使用

_Context.MyEntities.AddObject(theNewObject)

这会在调用.SaveChanges()

时注册要插入的已创建对象

您没有提供足够的信息来提供更完整的答案,但是创建一个新的实体,并以此方式添加它就是它的归宿。

答案 1 :(得分:1)

发现了这个问题。在我的存储过程映射中,我将Rating_ID设置为结果绑定。在我的存储过程中,我有以下内容:

RETURN SCOPE_IDENTITY()

而不是:

SELECT SCOPE_IDENTITY() AS Rating_ID

我不认为这是一个存储过程问题,因为我知道插入是正确的(我可以自己运行程序)并且没有插入记录。我想当它没有找到Rating_ID作为结果集的一部分时,它删除了记录。