实体框架持久性问题给出“ObjectStateManager不包含ObjectStateEntry,引用类型为...的对象”

时间:2010-07-31 19:53:10

标签: asp.net-mvc-2 savechanges

在我拥有的数据库中:

PK CountryID int notnull
PK ServiceID int notnull
PK TaskID int notnull
PK TaskItemID int notnull
PK CorrespondentID int notnull
PK PreviousTask int notnull
   IsOnTimeline bit not null
   ..and 5 other nullable fields

我正在使用此复合键来确保“ServiceSchedule”项的唯一性。 “Previoustask”字段是所有PK的串联,这个想法是我可以建立一个从记录到记录相关的细化“ServiceSchedule”任务时间线。

背景是:

UPEntities db = new UPEntities(); for all workings here (i.e. repository and db).

两个Edit控制器操作如下所示:

     public ActionResult Edit(int countryid,
                                int serviceid,
                                int taskid,
                                int taskitemid,
                                int correspondentid)
    {
        var t = (from s in repository.GetServiceSchedules()
                            where s.CountryID == countryid
                            where s.ServiceID == serviceid
                            where s.TaskID == taskid
                            where s.TaskItemID == taskitemid
                            where s.CorrespondentID == correspondentid
                            select s).First();

        return View(t);
    }



    [HttpPost]
    public ActionResult Edit(ServiceSchedule serviceToEdit)
    {

        var originalService = (from s in repository.GetServiceSchedules()
                               where s.CountryID == serviceToEdit.CountryID
                               where s.ServiceID == serviceToEdit.ServiceID
                               where s.TaskID == serviceToEdit.TaskID
                               where s.TaskItemID == serviceToEdit.TaskItemID
                               where s.CorrespondentID == serviceToEdit.CorrespondentID
                               select s).First();


       if (!ModelState.IsValid)

         return View(originalService);

         db.ApplyPropertyChanges(originalService.EntityKey.EntitySetName, serviceToEdit);        //Code throws exception here.......
         db.SaveChanges();

         return RedirectToAction("Index");           
    }

似乎一切正常,直到“db.ApplyPropertyChanges”行,我得到错误:

The ObjectStateManager does not contain an ObjectStateEntry with a reference to an object of type 'ProjectName.Models.ServiceSchedule'.

我注意到传递到编辑视图的模型包含来自相关表的集合(例如,CountryID中的国家/地区集合)但是当模型从视图返回时它只包含来自“ServciceSchedule”表的PK ID没有相关的收藏品。

我目前正试图通过在视图中创建隐藏页面来解决这个问题,但仍然无法将完整的模型重新放回控制器:

<% using (Html.BeginForm())
   {%>
    <%= Html.ValidationSummary(true)%>

    <fieldset>
        <legend>Fields</legend>


        <div class="editor-label">
            <%= Html.HiddenFor(model => model.CountryID)%>
        </div>

        <div class="editor-label">
            <%= Html.HiddenFor(model => model.ServiceID)%>
        </div>

        <div class="editor-label">
            <%= Html.HiddenFor(model => model.TaskID)%>
        </div>

        <div class="editor-label">
            <%= Html.HiddenFor(model => model.TaskItemID)%>
        </div>

        <div class="editor-label">
            <%= Html.HiddenFor(model => model.CorrespondentID)%>
        </div>



         <div class="editor-label">
            <%= Html.HiddenFor(model => model.Services)%>
        </div>

        <div class="editor-label">
            <%= Html.HiddenFor(model => model.Tasks)%>
        </div>

        <div class="editor-label">
            <%= Html.HiddenFor(model => model.TaskItems)%>
        </div>

        <div class="editor-label">
            <%= Html.HiddenFor(model => model.Correspondents)%>
        </div>


        <div class="editor-field">
            <%= Html.TextBoxFor(model => model.PreviousTask)%>
            <%= Html.ValidationMessageFor(model => model.PreviousTask)%>
        </div>

        <div class="editor-label">
            <%= Html.LabelFor(model => model.Cost)%>
        </div>
        <div class="editor-field">
            <%= Html.TextBoxFor(model => model.Cost, String.Format("{0:F}", Model.Cost))%>
            <%= Html.ValidationMessageFor(model => model.Cost)%>
        </div>

        <div class="editor-label">
            <%= Html.LabelFor(model => model.ChargeOut)%>
        </div>
        <div class="editor-field">
            <%= Html.TextBoxFor(model => model.ChargeOut, String.Format("{0:F}", Model.ChargeOut))%>
            <%= Html.ValidationMessageFor(model => model.ChargeOut)%>
        </div>

        <div class="editor-label">
            <%= Html.LabelFor(model => model.DurationInDays)%>
        </div>
        <div class="editor-field">
            <%= Html.TextBoxFor(model => model.DurationInDays, String.Format("{0:F}", Model.DurationInDays))%>
            <%= Html.ValidationMessageFor(model => model.DurationInDays)%>
        </div>

        <div class="editor-label">
            <%= Html.LabelFor(model => model.JobSection)%>
        </div>
        <div class="editor-field">
            <%= Html.TextBoxFor(model => model.JobSection)%>
            <%= Html.ValidationMessageFor(model => model.JobSection)%>
        </div>

        <div class="editor-label">
            <%= Html.LabelFor(model => model.JobSectionGroup)%>
        </div>
        <div class="editor-field">
            <%= Html.TextBoxFor(model => model.JobSectionGroup)%>
            <%= Html.ValidationMessageFor(model => model.JobSectionGroup)%>
        </div>

        <p>
            <input type="submit" value="Save" />
        </p>
    </fieldset>

<% } %>

此外,GetServiceSchedules存储库如下所示:

public class ServicesRepository
{
    UPEntities db = new UPEntities();


    public List<ServiceSchedule> GetServiceSchedules()
    {
        return db.ServiceScheduleSet.Include("Countries")
                                    .Include("Services")
                                    .Include("Tasks")
                                    .Include("TaskItems")
                                    .Include("Correspondents")
                                    .ToList();
    }

}

(使用VS 2008,SQL 2008,MVC2)

任何人都可以让我知道一些更有针对性的补救措施吗?

0 个答案:

没有答案