【问题标题】:Entity Framework SaveChanges dropping values实体框架 SaveChanges 删除值
【发布时间】:2013-10-08 22:03:11
【问题描述】:

我在实体框架中调用 SaveChanges 时会丢失下拉值。如果我在保存之前更改了下拉列表的值,则会保留该值。如果我不更改该值,则会在 SaveChanges 之后将其转换为 Nothing。这不会在我的整个应用程序中发生,但它确实发生在另一个控制器中的隐藏字段和日期字段中。

在调试时,我可以看到下拉列表的值在调用 SaveChanges 之前一直存在,所以我完全困惑为什么它之后消失了。

如果包含其他代码有帮助,请告诉我。

编辑:只是指出,我使用的是 Oracle 11g、MVC 4、Entity Framework 5。

这里是调用 SaveChanges 的 Save 方法:

  Private Function Save(EEOComplaint As EEOComplaintViewModel) As ActionResult
        Dim objEEOComplaint As STAFF_ACTION

        If EEOComplaint.STAFF_ACTION_ID = 0 Then
            objEEOComplaint = Mapper.Map(Of EEOComplaintViewModel, STAFF_ACTION)(EEOComplaint)
        Else
            Dim objExistingSeparation As STAFF_ACTION = db.STAFF_ACTION.Find(EEOComplaint.STAFF_ACTION_ID)
            objEEOComplaint = Mapper.Map(Of EEOComplaintViewModel, STAFF_ACTION)(EEOComplaint, objExistingSeparation)
        End If

        ValidateForm(ModelState, objEEOComplaint)

        If ModelState.IsValid Then

            'setting these to Nothing because the mapper is setting
            'them to "VPM.EEOComplaintViewModel" for some reason
            If objEEOComplaint.POSITN_ACTN_TYPE = "VPM.EEOComplaintViewModel" Then objEEOComplaint.POSITN_ACTN_TYPE = Nothing
            If objEEOComplaint.HIRG_REQST_APPRVL_TYPE = "VPM.EEOComplaintViewModel" Then objEEOComplaint.HIRG_REQST_APPRVL_TYPE = Nothing
            If objEEOComplaint.RECRTMNT_TYPE = "VPM.EEOComplaintViewModel" Then objEEOComplaint.RECRTMNT_TYPE = Nothing
            If objEEOComplaint.AWARD_TYPE = "VPM.EEOComplaintViewModel" Then objEEOComplaint.AWARD_TYPE = Nothing

            If EEOComplaint.ARCHIVE_IND = "Y" Then objEEOComplaint.END_DT = Now.ToShortDateString

            If EEOComplaint.STAFF_ACTION_ID = 0 Then
                objEEOComplaint.CREATED_BY = Session("AppUserID")
                db.STAFF_ACTION.Add(objEEOComplaint)
            Else
                objEEOComplaint.UPDATED_BY = Session("AppUserID")
                UpdateModel(objEEOComplaint)
            End If

            db.SaveChanges()

            Return RedirectToAction("Index")
        End If

        EEOComplaint = Mapper.Map(Of STAFF_ACTION, EEOComplaintViewModel)(objEEOComplaint)
        EEOComplaint = GetViewModel(EEOComplaint)
        If EEOComplaint.STAFF_ACTION_ID = 0 Then EEOComplaint.ARCHIVE_IND = "N"
        GetDropdownData(EEOComplaint)
        Return View(EEOComplaint)
    End Function

【问题讨论】:

    标签: vb.net asp.net-mvc-4 oracle11g entity-framework-5


    【解决方案1】:

    你能发布你的控制器代码吗?

    您的实体似乎没有被(正确)跟踪。在调试模式下,yourcontext.Entry(yourentity).State 的值是多少?

    检查以确保您没有将 EEO_COMPLAINT_TYPE_ID 设置器设置为内部。不要这样做: int EEO_COMPLAINT_TYPE_ID {get;内部集;}

    应该是:int EEO_COMPLAINT_TYPE_ID {get;设置;}

    【讨论】:

    • Save 函数实际上是控制器中唯一相关的代码,除了 db 是在类中创建的,在所有其他方法(类级别变量)之外。您在寻找特定的东西吗? db.Entry(objEEOComplaint).State = Modified 这似乎很好,因为即使一个下拉值被删除,我也可以更新表单中的其他值。
    • 如果 objEEOComplaint == EntityState.Modified 在 db.SaveChanges() 和 objEEOComplaint 之前的实体状态具有正确的值,它确实应该保存所有值。您真的确定下拉框中的值在 db.SaveChanges() 之前的 objEEOComplaint 中正确吗?您可以检查生成的 SQL 语句以了解发生了什么。
    • 我无法编辑添加图像,所以这里是之前:imgur.com/0W5sqCb 和之后:imgur.com/cfSkYfI 您可以看到突出显示的属性从 6 变为 Nothing。
    • 是否可以将 EEO_COMPLAINT_TYPE_ID 设置器设置为内部?像这样: int EEO_COMPLAINT_TYPE_ID {get;内部集;}
    • STAFF_ACTION 类是我通过实体框架设置数据源时自动生成的。该属性设置为 Public Property EEO_COMPLAINT_TYPE_ID As Nullable(Of Integer)
    猜你喜欢
    • 2012-09-06
    • 1970-01-01
    • 2016-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-29
    • 1970-01-01
    • 2023-04-07
    相关资源
    最近更新 更多