Обнаружение измененной и новой записи и обновление измененной записи с помощью ASP.NET MVC 2, EF v4, POCO и шаблона репозитория - PullRequest
1 голос
/ 04 февраля 2011

Я использую 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);
    }
}

1 Ответ

0 голосов
/ 13 марта 2011

Вы, кажется, повторяете свой код, который ему не нужен:

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)
                           .first();

                if (partyCount == null)
                {
                    party.Party_Identifications.Add(partyidentification);
                }
                else
                {
                    partyCount.IdentificationValue = partyidentification.IdentificationValue;
                    partyCount.PartyIdentificationEndDate = partyidentification.PartyIdentificationEndDate;
                    partyCount.ModificationDate = DateTime.Now;
                    partyCount.ModifiedByName = User.Identity.Name.ToString();
                }
                partiesRepository.SaveParty(party);

                return View("Edit", party);
            }
            else
            {
                return View("Edit", partyidentification);
            }
...