Я использую ASP.NET MVC 2, Entity Framework v4, генератор объектов ADO.NET C # POCO и шаблон репозитория. Много модных слов!
Настройка:
У меня есть репозиторий, IPartiesRepository . У меня есть объект Party и объект * Party_Identification *. Сторона - это общий термин для человека или организации.
На уровне SQL / физической модели таблица Party имеет единственный первичный ключ, PartyId. Таблица Party_Identification имеет составной ключ, состоящий из трех полей - PartyId, IdentificationTypeCode и IdentificationStartDate.
У меня строго типизированное (на Party ) представление, в котором перечислены сведения о партии и соответствующие идентификационные данные. Пользователь может редактировать идентификацию стороны; ссылки для редактирования создаются через ActionLink, который выглядит так:
<h3>Identification Data</h3>
<% foreach (var Identification in Model.Party_Identifications) { %>
<%: Identification.IdentificationTypeCode %>: <%: Identification.IdentificationValue %> - <%: Html.ActionLink("Edit", "EditIdentification", new { partyId = Identification.PartyId, idTypeCode = Identification.IdentificationTypeCode, startDate = Identification.PartyIdentificationStartDate })%><br />
<% } %>
Метод EditIdentification () в PartyController выглядит следующим образом:
public ActionResult EditIdentification(int partyId, string idTypeCode, string startDate)
{
var party = partiesRepository.GetPartyById(partyId);
var identification = party.Party_Identifications.Where(x => x.PartyId == partyId && x.IdentificationTypeCode == idTypeCode && x.PartyIdentificationStartDate == DateTime.Parse(startDate)).First();
return View("EditIdentification", identification);
}
Представление EditIdentification позволяет пользователю изменять идентификационную запись с помощью базовой формы:
<% using (Html.BeginForm("EditIdentification", "Party")) { %>
<%: Html.EditorForModel()%>
<input type="submit" value="Save" />
<% } %>
Проблема:
У меня есть другой EditIdentification () метод в PartyController, который обрабатывает сохранение. Я пытаюсь увидеть, обновляем ли мы существующую запись идентификации или создаем новую (у меня также есть метод Create () в PartyController , который возвращает EditIdentification представление с объектом Party_Identification в качестве модели).
Я знаю, что есть лучший способ сделать то, что я делаю ниже (в частности, обнаружение измененной и новой записи и обновление измененной записи) - как я могу улучшить это?
[HttpPost]
public ActionResult EditIdentification(Party_Identification partyidentification)
{
TryUpdateModel(partyidentification);
if (partyidentification.CreationDate == DateTime.Parse("01/01/0001"))
{
partyidentification.CreationDate = DateTime.Now;
partyidentification.CreatedByName = User.Identity.Name.ToString();
partyidentification.ModificationDate = DateTime.Now;
partyidentification.ModifiedByName = User.Identity.Name.ToString();
}
// TODO: Validation goes here...
if (ModelState.IsValid)
{
var party = partiesRepository.GetPartyById(partyidentification.PartyId) as Party;
int partyCount = party.Party_Identifications
.Where(x => x.PartyId == partyidentification.PartyId &&
x.IdentificationTypeCode == partyidentification.IdentificationTypeCode &&
x.PartyIdentificationStartDate == partyidentification.PartyIdentificationStartDate)
.Count();
if (partyCount == 0)
{
party.Party_Identifications.Add(partyidentification);
}
else
{
var idtoupdate = party.Party_Identifications
.Where(x => x.PartyId == partyidentification.PartyId &&
x.IdentificationTypeCode == partyidentification.IdentificationTypeCode &&
x.PartyIdentificationStartDate == partyidentification.PartyIdentificationStartDate)
.First();
idtoupdate.IdentificationValue = partyidentification.IdentificationValue;
idtoupdate.PartyIdentificationEndDate = partyidentification.PartyIdentificationEndDate;
idtoupdate.ModificationDate = DateTime.Now;
idtoupdate.ModifiedByName = User.Identity.Name.ToString();
}
partiesRepository.SaveParty(party);
return View("Edit", party);
}
else
{
return View("Edit", partyidentification);
}
}