Entity Framework 4.1 - Code First - невозможно обновить значения DateTime nullabe при разрешении DbUpdateConcurrencyException - PullRequest
8 голосов
/ 29 августа 2011

В настоящее время у меня есть объект, который я пытаюсь отредактировать через мое веб-приложение MVC 3. Я получаю DbUpdateConcurrencyException при попытке выполнить подход, основанный на выигрыше клиента, который я получил из публикации MSDN Использование DbContext в EF 4.1, часть 9: оптимистичные шаблоны параллелизма Странная часть в том, что это происходит только с этой конкретной сущностью, и там я не делаю ничего, отличного от другой. Кроме того, это происходит только при обновлении с нуля до значения. Свойства, выдающие ошибку при обновлении с нулевого значения до значения DateTime: DispositionLetterDate и DateDisposition.

Класс:

public class A22
{
    public A22()
    {
        this.IsArchived = false;
        this.A22StatusId = (int)AStatus.Open;
    }

    [Key]
    public int Id { get; set; }

    [Required]
    [StringLength(100, ErrorMessage="A22 Number cannot exceed 100 characters")]
    public string Number { get; set; }

    [Display(Name="Manual")]
    public int ManualId { get; set; }

    [Display(Name="SGMLID")]
    public string SGMLId { get; set; }

    [Required]
    [DataType(DataType.Date)]
    [Display(Name="Date Received")]
    public DateTime DateReceived { get; set; }

    [Display(Name= "Status")]
    [EnumDataType(typeof(A22Status))]
    public int A22StatusId { get; set; }

    [Display(Name="Priority")]
    [EnumDataType(typeof(A22Priority))]
    public int A22PriorityId { get; set; }

    [Display(Name="Providing Disposition")]
    public string ProvidingDisposition { get; set; }

    [Display(Name="Final Disposition")]
    public bool FinalDisposition { get; set; }

    [Display(Name="Is Archived")]
    public bool IsArchived { get; set; }

    [Display(Name="Created By")]
    public int CreatedById { get; set; }

    [Display(Name="Date Created")]
    public DateTime DateCreated { get; set; }

    [ConcurrencyCheck]
    [Display(Name="Date Modified")]
    public DateTime DateModified { get; set; }

    [Display(Name = "Disposition Date")]
    public DateTime? DateDisposition { get; set; }

    [Display(Name = "Date Disposition Letter Sent")]
    public DateTime? DispositionLetterDate{ get; set; }

    // Virtual Properties

    [ForeignKey("CreatedById")]
    public virtual User CreatedBy { get; set; }

    [ForeignKey("ManualId")]
    public virtual Manual Manual { get; set; }

    public virtual ICollection<A22Manual> A22ManualsImpacted { get; set; }

    public virtual ICollection<A22Task> A22TasksImpacted { get; set; }

    public virtual ICollection<A22Comment> Comments { get; set; }

    public virtual ICollection<A22HistoryLog> HistoryLogs { get; set; }
}

Контроллер:

[HttpPost]
public ActionResult Edit(A22 a22)
{
    var d = new A22Repository().Find(a22.Id);
    var changes = TrackChanges(d, a22);
    if (ModelState.IsValid) {
        if (!string.IsNullOrEmpty(changes))
        {
            repository.InsertOrUpdate(a22);
            this.repository.AddHistory(a22, changes);
            repository.Save();
        }
        return RedirectToAction("Details", new { id = a22.Id });
    } else {
        ViewBag.PossibleManuals = d.ManualId == default(int) ? manualRepo.GetManualList() :
                                                               manualRepo.GetManualList(d.ManualId);
        ViewBag.APriority = repository.GetAPriorityList(d.APriorityId);
        ViewBag.AStatus = repository.GetAStatusList(d.APriorityId);
        return View();
        }
    }
}

Вид:

@model TPMVC.Web.Models.A22

@{
    Layout = "~/Views/Shared/_BlendLayoutLeftOnly.cshtml";
    ViewBag.Title = "Edit";
}

<h2>Edit A22# @Model.Number</h2>

@using (Html.BeginForm())
{
    @Html.ValidationSummary(true)
    @Html.HiddenFor(model => model.Id)
    @Html.HiddenFor(model => model.CreatedById)
    @Html.HiddenFor(model => model.DateCreated)
    @Html.HiddenFor(model => model.DateModified)
    @Html.Partial("_CreateOrEdit")

    <div class="newItemLabel">
        <strong style="padding-right: 145px;">@Html.LabelFor(model => model.AStatusId)</strong>
    @{
        Html.Telerik().DropDownList()
            .Name("AStatusId")
            .BindTo((IEnumerable<SelectListItem>)ViewBag.AStatus)
            .HtmlAttributes(new { @style = "width: 200px;" })
            .Render();
     }
        @Html.ValidationMessageFor(model => model.AStatusId)
    </div>

    <div class="newItemLabel">
        <strong style="padding-right: 77px;">@Html.LabelFor(model => model.FinalDisposition)</strong>
        @Html.EditorFor(model => model.FinalDisposition)
    </div>

    <div class="newItemLabel">
        <strong style="padding-right: 44px;">@Html.LabelFor(model => model.DateDisposition)</strong>
        @{
          Html.Telerik().DatePickerFor(model => model.DateDisposition)
            .Render();       
        }
    </div>

    <div class="newItemLabel">
        <strong style="padding-right: 44px;">@Html.LabelFor(model => model.DispositionLetterDate)</strong>
       @{
           Html.Telerik().DatePickerFor(model => model.DispositionLetterDate)
            .Render();       
        }
    </div>

    <div class="newItemLabel">
        <strong style="padding-right: 110px;">@Html.LabelFor(model => model.IsArchived)       </strong>
        @Html.EditorFor(model => model.IsArchived)
    </div>

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

}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

Подумав, что это могло быть что-то с аннотациями данных, я решил определить свойства этой проблемы как необязательные, используя Fluid API.

modelBuilder.Entity<A22>().Property(a => a.DateDisposition).IsOptional();
modelBuilder.Entity<A22>().Property(a => a.DispositionLetterDate).IsOptional();

Мне в основном нужна свежая пара глаз, чтобы увидеть, что я что-то упускаю. Есть ли другое свойство, которое заставляет его вести себя таким образом?

Заранее спасибо.

1 Ответ

1 голос
/ 21 декабря 2011

Я отображаю обнуляемые свойства DateTime, например, без методов IsOptional.Также он отлично работает с MS SQL и MySQL мной.

this.Property(t => t.CreatedDate).HasColumnName("CreatedDate");
this.Property(t => t.ModifiedDate).HasColumnName("ModifiedDate");

в классе, производном от EntityTypeConfiguration.Я использую Code First.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...