Использование 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();
}
}
Возможно, вы дважды вызываете действие. – user2674389
Как вы называете действие «Изменить»? Показать код. – alexmac