当我使用Json Create操作创建新记录时,我试图纠正重复记录问题。
我视图中的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被记录两次,有两个不同的id。记录alertMap和recipientMap没有重复。
我已经使用VS debug和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语法不正确......我还能做另一项测试吗? 感谢
编辑:我认为这是AlertID外键的一个问题。 AlertID在AlertLog表上,作为具有标识增量的主键。我在我的RecipientMap中引用了AlertID作为外键。当用户编写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外键配置不好
编辑2:好的,这是最后一步。
最后一件事,我不明白。它是关于如何在我的数据表中添加列表的。我试图使用列表,但是,我错过了一些东西。
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一起使用。这就是为什么它在开始时没有起作用的原因。非常感谢你的帮助!
答案 0 :(得分:0)
听起来你有一个主人(AlertLog)和两个细节(RecipientMap,AlertMap)。如果你在SQL Server中设置了关系,请检查一下:
// create Master
var AL = new AlertLog()
{ AlertModeID = alertLog.AlertModeID, AlertPriorityID = alertLog.AlertPriorityID};
// create Details
var RM = new RecipientMap() { .. = ...}; // Do NOT consider FK here!
var AM = new AlertMap() { .. = ... }; // Do NOT consider FK here!
// add Details to Master
AL.RecipentMaps.Add(RM); // FK is automatically set here
AL.AlertMaps.Add(AM); // FK is automatically set here
db.AlertLog.Add(AL); // add Master
db.SaveChanges();
答案 1 :(得分:0)
首先,请确保您使用的是最新的EF 6.1.3
,其次,您可能需要将此答案与之前的答案结合起来。
所以,有一个List<RecipientMap>
如下:
int ipGroupID = // something you know how to find
var RM1 = new RecipientMap(){IPgroupID = ipGroupID, ..};
var RM2 = new RecipientMap(){IPgroupID = ipGroupID, ..};
var RM3 = new RecipientMap(){IPgroupID = ipGroupID, ..};
var listRM = new List<RecipientMap>(){RM1, RM2, RM3};
然后,您需要AL.RecipentMaps.Add(RM)
而不是AL.RecipentMaps.AddRange(listRM)
,而是将更改保存到db
。这样,系统会自动设置AlertLog
的FK,并且IPgroupID
之前已设置为RecipientMap
列表。
答案 2 :(得分:-1)
在某些使用JQuery的情况下,程序员可能会意外地为Submit提供两个事件处理程序!检查这个问题,你是否在你的JQuery处理程序旁边有“onClick”?