为什么我会在“元数据集合中不存在具有标识'ReturnValue'的成员”错误?

时间:2010-11-28 21:19:40

标签: .net asp.net odata ado.net-entity-data-model

我在visual studio中设置OData提供程序。我收到的错误实际上与OData方面没有任何关系。

我的ado实体数据模型中有一个表类型,每当我尝试在此表中插入记录时,都会出现以下错误:

  

{“元数据集合中不存在具有标识'ReturnValue'的成员。   参数名称:identity“}

这是堆栈跟踪:

  

at System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager,IEntityAdapter adapter)      在System.Data.EntityClient.EntityAdapter.Update(IEntityStateManager entityCache)      在System.Data.Objects.ObjectContext.SaveChanges(SaveOptions选项)      在System.Data.Objects.ObjectContext.SaveChanges()      在OData.CreateWorkOrder(Int32 CreatedByContactID)中   D:\ Web \ OData.svc.vb:第31行

有没有人听说过这个错误?我可以很好地插入到任何其他表中,它似乎只是这个ado实体数据模型不想玩的表。

提前致谢

''# this comment is just here because the code formatter doesn't play nice otherwise.
<WebGet()> _
Public Function CreateWorkOrder(ByVal CreatedByContactID As Integer) As WorkOrder
    Dim x As New MyAppEntities

    Dim wo As WorkOrder = MyApp.WorkOrder.CreateWorkOrder(Nothing, 100, 4, False, DateTime.Now, False, 0, 1, 0, 0, 0, 0, 0, 0, False, 0, 0, 0, False, CreatedByContactID, DateTime.Now, 1, DateTime.Now)
    x.AddToWorkOrders(wo)
    x.SaveChanges()
    Return wo
End Function

2 个答案:

答案 0 :(得分:0)

我假设这是错误行

Dim wo As WorkOrder = MyApp.WorkOrder.CreateWorkOrder(Nothing, 100, 4, False, DateTime.Now, False, 0, 1, 0, 0, 0, 0, 0, 0, False, 0, 0, 0, False, CreatedByContactID, DateTime.Now, 1, DateTime.Now)

现在第一个参数是“Nothing”,我假设它应该是存储过程的“返回值”(你使用存储过程吗?)。

如果您实际上正在使用类似@ID int output之类的存储过程,那么您需要在代码中使用正确的输出参数

        Dim IDOut As Integer
        Dim wo As WorkOrder = MyApp.WorkOrder.CreateWorkOrder(IDOut, 100, 4, False, DateTime.Now, False, 0, 1, 0, 0, 0, 0, 0, 0, False, 0, 0, 0, False, CreatedByContactID, DateTime.Now, 1, DateTime.Now)

        ''# Do crap with IDOut like redirect to http://example.com?workorder=[IDOut]

但正如我在评论中所说,你最好使用LINQ to SQL并避免使用Stored Procedures进行简单的插入。

的内容
    Public Sub GenerateWorkOrder()

        Dim workOrder As New WorkOrder
        With workOrder
             .somestringParameter1 = "the parameter"
             .someintegerParameter1 = 5
             ''# etc
        End With

        CreateWorkOrder(workOrder)
        SubmitChanges()

    End Sub


    Public Sub CreateWorkOrder(ByVal workOrder As WorkOrder)
        ''# dc is simply the DataContext
        dc.WorkOrders.InsertOnSubmit(workOrder)
    End Sub

    Public Sub SubmitChanges()
        dc.SubmitChanges()
    End Sub

答案 1 :(得分:0)

标识密钥区分大小写。请检查它是否作为参数正确提供。 例如:

context.mCustomersReference.EntityKey = new EntityKey("BulkEntities.CustomerSet", "CustomerId", Convert.ToInt64(id));