Я пытаюсь исправить проблему с дублирующейся записью при создании новой записи с помощью действия Json Create.Повторяющаяся запись в db с Json Создание Action Asp.Net MVC
Json скрипт на мой взгляд
$.ajax({
url:'/Panels/CreateNewAlert',
dataType:'json';
type:'post',
contentType:'application/json;charset=utf-8'
data:JSON.stringify({
alertMap:{AlertModeID:$('#AlertModeID').val(),AlertPriorityID:$('#AlertPriorityID').val()},
alertLog:{AlertTitle:$('#AlertLog_AlertTitle').val(),AlertText:$('#AlertLog_AlertText').val(),AlertStartDate:$('#AlertLog_AlertStartDate').val(),AlertActive:'true'},
recipientlistip:brutelistip,
recipientlistpc:brutelistpc
}),
async:true,
processData:false,
cache:false,
succes:function(data){
alert(data);
},
error:function(xhr){
alert('error');
}
})
Контроллер
[HttpPost]
public JsonResult CreateNewAlert(AlertMap alertMap, AlertLog alertLog, RecipientMap recipientMap, int[] recipientlistip, int[] recipientlistpc)
{
if(ModelState.IsValid)
{
db.AlertLog.Add(alertLog);
db.SaveChanges();
int alertid = alertLog.AlertID;
recipientMap.IPgroupID = 3;
recipientMap.AlertID = alertid;
db.RecipientMap.Add(recipientMap);
db.SaveChanges();
alertMap.AlertID=alertid;
alertMap.UsersID= User.Identity.GetUserId();
db.AlertMap.Add(alertMap);
db.SaveChanges();
}
return Json("Succes!");
}
Я не понимаю, почему alertLog записывается дважды, с двумя различными ид. alertMap и recipientMap записываются без дубликата.
Я проверил с ответом VS и db.SaveChanges()
для alertLog, выполняется только один раз. Я пробовал тест:
alertLog.AlertActive = true;
alertLog.AlertTitle = "pif";
alertLog.AlertText = "pof";
alertLog.AlertStartDate = DateTime.Now;
alertLog.AlertEndDate = DateTime.Now;
db.AlertLog.Add(alertLog);
db.SaveChanges();
Я добавил данные непосредственно в контроллер ... и нет дубликатов. Может быть, мой синтаксис Json, который является неправильным ... Есть ли еще один тест, который я мог бы сделать? Thanks
EDIT: Я думаю, что это проблема с внешним ключом AlertID. AlertID находится в таблице AlertLog, как первичный ключ с приращением идентичности. У меня есть ссылка на AlertID в моей RecipientMap как внешний ключ. Когда пользователь пишет DeskAlert, он выбирает список получателей для этого предупреждения (группа IP или группа pc). Так RecipientMap таблица может нравится:
|ID(Pk)|IPgroupID(fk)|PCgroupID(fk)|AlertID(fk)|
|------|-------------|-------------|-----------|
| 1 | 1 | null | 15 |
| 2 | 1 | null | 15 |
| 3 | 2 | 1 | 16 |
Я думаю, что моя проблема в том, AlertID внешний ключ не хорошо сконфигурирован
EDIT 2: Ok это последний шаг.
Есть последнее, что я не понимаю. Речь идет о том, как добавить список в мой datatable. Я пытаюсь использовать список, но я что-то пропустил.
var AL = new AlertLog()
{..};
var IPlist = new List<RecipientMap>();
var rp = new RecipientMap();
foreach (int ipid in recipientlistip)
{
RM.IPgroupID = ipid;
}
IPlist.Add(rp);
AL.RecipientMap.AddRange(IPlist);
С последней строке я получаю эту ошибку на AddRange "System.Collections.Generic.ICollection<WebAppDev.RecipientMap> does not contain a definition for 'AddRange' and no extension method 'AddRange' accepting a first argument of type System.Collections.Generic.ICollection<WebAppDev.RecipientMap> could be found (are you missing a using directive or an assembly reference?)"
В моем файле класса модели IPgroupID и PCgroupID являются:
public Nullable<int>IPgroupID {get;set;}
public Nullable<int>PCgroupID {get;set;}
И РЕШЕНИЕ! Да Это сработало! В моем контроллере я сделал это (для одного списка):
List<RecipientMap>IPlist= new List<RecipientMap>();
for (int i = 0;i<recipientlistip.Length;i++){
IPlist.Add(new RecipientMap
{
IPgroupID = recipientlistip[i]
});
}
AL.RecipientMap.AddRange(IPlist);
Но я также добавил ExtensionMethods для использования AddRange с ICollection. Вот почему это не сработало с самого начала. Спасибо вам большое за вашу помощь!
Является ли это проблемой в настройке базы данных или сущности? ForeignKeys? Триггеры? Ваша клиентская сторона и код контроллера выглядят отлично. – scgough