2013-11-13 4 views
0

Использование MVC 5, EF 6.01 и Identity в Visual Studio 2013 web express.Дублированная запись, созданная с сохранением изменений в db в Entity Framework 6

Я думал, что было бы простой задачей добавить таблицу истории, чтобы отслеживать изменения в ценообразовании. Для каждого сохранения родительской записи создаются две записи истории ребенка и не знаю, почему. Я пробовал подход ниже, а также не использовал коллекцию (изолированная таблица истории, которая обновляется отдельно). Также попытался изменить порядок событий в контроллере.

private AppDb db = new AppDb(); 
private UserManager<IdentityUser> userManager = new UserManager<IdentityUser>(new UserStore<IdentityUser>()); 

public class Threshold 
{ 
    public int ThresholdId { get; set; } 
    public string ItemId { get; set; } 
    public string OfficeCode { get; set; } 
    public string Unit { get; set; } 
    public string Type { get; set; } 
    public string Color { get; set; } 
    public string Frequency { get; set; } 
    public decimal Price { get; set; } 
    public decimal OldPrice { get; set; } 
    public int? Volume { get; set; } 
    public int? Sort { get; set; } 
    public DateTime? DateModified { get; set; } 
    public virtual ICollection<Threshold_History> Threshold_History { get; set; } 
} 

public class Threshold_History 
{ 
    public int Threshold_HistoryId { get; set; } 
    public int ThresholdId { get; set; } 
    public decimal PriceFrom { get; set; } 
    public decimal PriceTo { get; set; } 
    public DateTime DateCreated { get; set; } 
    public string UserId {get; set;} 
    public virtual Threshold Threshold { get; set; } 
} 

Контроллер:

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Edit([Bind(Include="ThresholdId,ItemId,OfficeCode,Unit,Type,Color,Frequency,Price,Volume,Sort,OldPrice")] Threshold threshold) 
{ 
    if (ModelState.IsValid) 
    { 
     db.Entry(threshold).State = EntityState.Modified; 

     //update history table 
     Threshold_History hist = new Threshold_History(); 
     List<Threshold_History> histories = new List<Threshold_History>(); 
     hist.ThresholdId = threshold.ThresholdId; 
     hist.PriceFrom = threshold.OldPrice; 
     hist.PriceTo = threshold.Price; 
     hist.DateCreated = DateTime.Now; 
     hist.UserId = User.Identity.GetUserId(); 

     histories.Add(hist); 

     threshold.DateModified = DateTime.Now; 
     threshold.Threshold_History = histories; 

     db.SaveChanges(); 

     return Json(new { success = true }, JsonRequestBehavior.AllowGet); 
    } 
} 

Одно примечание: каждый Step Over в отладчик должен быть нажата два раза. Его почти так же, как и два экземпляра кода, работающего одновременно. Другие модули и классы работают правильно при переходе.

EDIT, чтобы добавить, как вызывается Edit. Именно из вызова Ajax в модальном диалоге:

//modal functions 
function editItem(e){ 
e.preventDefault(); 
$('#dialogContent').load(this.href, function() { 
    $('#dialogDiv').modal({ 
     backdrop: 'static', 
     keyboard: true 
    }, 'show'); 
    bindForm(this); 
}); 
return false; 
}; 

function bindForm(dialog) { 
$('form', dialog).submit(function() { 

    $.ajax({ 
     url: this.action, 
     type: this.method, 
     data: $(this).serialize(), 
     success: function (result) { 
      if (result.success) { 
       $('#dialogDiv').modal('hide'); 
       loadTab(tabRef); 
      } else { 
       $('#dialogContent').html(result); 
       $('#dialogDiv').modal({ 
        backdrop: 'static', 
        keyboard: true 
       }, 'show'); 
       bindForm(); 
      } 
     }, 
     error: function (requestObject, error, errorThrown) { 
      $('#modalError').html("<br><p>" + errorThrown + "</p> "); 
     } 
    }); 
    return false; 
}); 
} 

function validateModal() { 
var form = $(".modal-form"); 
$.validator.unobtrusive.parse(form); 
if (form.valid()) { 
    form.submit(); 
} 
} 
+0

Возможно, вы дважды вызываете действие. – user2674389

+0

Как вы называете действие «Изменить»? Показать код. – alexmac

ответ

2

Вы называете validateModal() от кнопки отправки на форме? Я не вижу никаких preventDefault или return false, так что существует вероятность, что кнопка отправки вызовет validateModal, что заставляет форму размещаться и что кнопка отправки все еще выполняет функцию по умолчанию: размещение формы. Это объясняет дублирование вызовов.

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

+0

Да, кнопка отправки еще имела тип = 'submit'. Я искал гораздо более сложную проблему. Чувствуя себя немного застенчивым, теперь .... – user2557714

+0

Добро пожаловать. Все проблемы просты, как только вы знаете решение, и чем болезненнее был опыт обучения, тем легче запомнить его (тот факт, что мое предположение было правильным, показывает, что мой опыт обучения, связанный с подобной «ошибкой», был действительно болезненным, поэтому я вы точно были в своей ситуации). –

Смежные вопросы