Проблема персистентности Entity Framework, приводящая к «ObjectStateManager не содержит ObjectStateEntry со ссылкой на объект типа ..» - PullRequest
1 голос
/ 31 июля 2010

В базе данных у меня есть:

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'.

Я заметил, что модель, переданная в представление редактирования, содержит коллекции из связанной таблицы (например, коллекцию стран из идентификатора страны), но когда модель возвращается из представления, она содержит только идентификаторы PK из таблицы «ServciceSchedule» и не связанаколлекции.

В настоящее время я пытаюсь противостоять этой проблеме, создавая скрытые функции в представлении, подобном этому, но все еще не могу вернуть полную модель обратно в контроллер:

<% 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)

МожетКто-нибудь, дайте мне знать, какие еще лекарства предлагают?

...