В базе данных у меня есть:
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)
МожетКто-нибудь, дайте мне знать, какие еще лекарства предлагают?