2011-08-29 20 views
8

Tôi hiện đang có một thực thể mà tôi đang cố chỉnh sửa thông qua ứng dụng web MVC 3 của mình. Tôi nhận được một DbUpdateConcurrencyException khi cố gắng thực hiện một khách hàng thắng cách tiếp cận tôi nhận được từ bài viết của MSDN Using DbContext in EF 4.1 Part 9: Optimistic Concurrency Patterns. Phần kỳ lạ là điều này chỉ xảy ra trên thực thể đặc biệt này và ở đó tôi không làm gì khác với cái kia. Ngoài ra, nó chỉ xảy ra khi cập nhật từ giá trị null thành giá trị. Thuộc tính đưa ra lỗi khi cập nhật từ giá trị null thành giá trị DateTimeDispositionLetterDateDateDisposition.Entity Framework 4.1 - Code First - Không thể cập nhật các giá trị DateTime nullabe trong khi giải quyết DbUpdateConcurrencyException

Class:

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; } 
} 

Bộ điều khiển:

[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(); 
     } 
    } 
} 

Xem:

@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> 

Suy nghĩ đó là có thể là một cái gì đó với chú thích dữ liệu, tôi đã quyết định để xác định các thuộc tính với vấn đề này cho tùy chọn bằng cách sử dụng API Fluid.

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

Tôi về cơ bản cần một đôi mắt mới để xem tôi có thiếu thứ gì đó không. Có tài sản nào khác khiến nó hoạt động theo cách này không?

Xin cảm ơn trước.

+0

Trên cơ sở dữ liệu nào được ánh xạ cấu hình EF của bạn? MS SQL Server, MySQL, cái gì khác? – Regfor

+0

Có một lỗi liên quan đến việc cập nhật thuộc tính nullable từ null thành giá trị. Nếu bạn đăng các mã cho InsertOrUpdate tôi có thể cho bạn biết có hay không bạn đang đánh nó. – cadrell0

Trả lời

1

Tôi đang ánh xạ các thuộc tính DateTime không thể sử dụng như sau mà không có phương pháp IsOptional. Ngoài ra nó hoạt động tốt với MS SQL và MySQL của tôi.

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

trong lớp bắt nguồn từ EntityTypeConfiguration. Tôi đang sử dụng phương pháp Code First.

Các vấn đề liên quan