【发布时间】:2019-09-27 23:05:40
【问题描述】:
我正在制作一个 MVC Web 应用程序,其中一个表单会影响数据库中的许多表。我有页面加载信息到实体框架中,但是当我运行 db.SaveChanges() 时出现重复的实体错误。数据库完全是空的,所以保存时一定有一些错误。
我怀疑这与我如何将数据上传到框架有关,但我无法找出正确的方法。
这是模型:
public class BOGOModel
{
public BOGOModel()
{
}
public string PROMOTION_CODE { get; set; }
public string DESCRIPTION { get; set; }
public DateTime START_DATE_TIME { get; set; }
public DateTime END_DATE_TIME { get; set; }
public int[] BUY_MEMBERS { get; set; }
public int[] GET_MEMBERS { get; set; }
public int PERCENT_OFF { get; set; }
}
这里是控制器:
public ActionResult BOGO()
{
return View();
}
[HttpPost]
public JsonResult BOGOSave(string MemberData)
{
BOGOModel ModelData = JsonConvert.DeserializeObject<BOGOModel>(MemberData);
PROMOTION Promotion = new PROMOTION();
Promotion.PROMOTION_CODE = ModelData.PROMOTION_CODE;
Promotion.DESCRIPTION = ModelData.DESCRIPTION;
Promotion.PROMOTION_TYPESysID = 12001;
Promotion.PROMOTION_APPLY_ASSysID = 98401;
Promotion.START_DATE_TIME = ModelData.START_DATE_TIME.ToString();
Promotion.END_DATE_TIME = ModelData.END_DATE_TIME.ToString();
db.PROMOTIONs.Add(Promotion);
AT_PROMOTION_ORG_UNIT PromotionOrgUnit = new AT_PROMOTION_ORG_UNIT();
PromotionOrgUnit.ORG_UNIT = "150";
PromotionOrgUnit.ORG_UNIT_TYPE = "Outlet";
PromotionOrgUnit.PARENT_ORG_UNIT = "DG";
db.AT_PROMOTION_ORG_UNIT.Add(PromotionOrgUnit);
ALLOCATED_ORG_UNIT AllocatedOrgUnit = new ALLOCATED_ORG_UNIT();
AllocatedOrgUnit.AT_PROMOTION_ORG_UNIT = PromotionOrgUnit;
db.ALLOCATED_ORG_UNIT.Add(AllocatedOrgUnit);
MP_PROMOTION__ALLOCATED_ORG_UNIT Map_P_A = new MP_PROMOTION__ALLOCATED_ORG_UNIT();
Map_P_A.PROMOTION = Promotion;
Map_P_A.ALLOCATED_ORG_UNIT = AllocatedOrgUnit;
db.MP_PROMOTION__ALLOCATED_ORG_UNIT.Add(Map_P_A);
PROMOTION_RULE BuyRule = new PROMOTION_RULE();
BuyRule.TARGET_TYPESysID = 1;
BuyRule.TARGET = 1;
db.PROMOTION_RULE.Add(BuyRule);
AT_PROMOTION_SET BuySetAttributes = new AT_PROMOTION_SET();
BuySetAttributes.name = "Buy";
BuySetAttributes.type = "BENEFIT";
BuySetAttributes.PROMOTION_SELECTIONSysID = 1;
db.AT_PROMOTION_SET.Add(BuySetAttributes);
PROMOTION_SET BuySet = new PROMOTION_SET();
BuySet.AT_PROMOTION_SET = BuySetAttributes;
db.PROMOTION_SET.Add(BuySet);
foreach(int upc in ModelData.BUY_MEMBERS)
{
AT_PROMOTION_MEMBER_KEY_VALUE MemberValue = new AT_PROMOTION_MEMBER_KEY_VALUE();
MemberValue.KEY_VALUE = upc;
db.AT_PROMOTION_MEMBER_KEY_VALUE.Add(MemberValue);
PROMOTION_MEMBER Member = new PROMOTION_MEMBER();
Member.LK_KEY_TYPE = db.LK_KEY_TYPE.Where(Type => Type.KEY_TYPESysID == 1).First();
Member.AT_PROMOTION_MEMBER_KEY_VALUE = MemberValue;
db.PROMOTION_MEMBER.Add(Member);
MP_PROMOTION_SET__PROMOTION_MEMBER Map_S_M = new MP_PROMOTION_SET__PROMOTION_MEMBER();
Map_S_M.PROMOTION_SET = BuySet;
Map_S_M.PROMOTION_MEMBER = Member;
db.MP_PROMOTION_SET__PROMOTION_MEMBER.Add(Map_S_M);
}
PROMOTION_RULE GetRule = new PROMOTION_RULE();
GetRule.TARGET_TYPESysID = 1;
GetRule.TARGET = 1;
GetRule.BENEFIT_TYPESysID = 5;
GetRule.BENEFIT = ModelData.PERCENT_OFF;
db.PROMOTION_RULE.Add(GetRule);
AT_PROMOTION_SET GetSetAttributes = new AT_PROMOTION_SET();
GetSetAttributes.name = "Get";
GetSetAttributes.type = "TARGET";
GetSetAttributes.PROMOTION_SELECTIONSysID = 1;
db.AT_PROMOTION_SET.Add(GetSetAttributes);
PROMOTION_SET GetSet = new PROMOTION_SET();
GetSet.AT_PROMOTION_SET = GetSetAttributes;
db.PROMOTION_SET.Add(GetSet);
foreach (int upc in ModelData.GET_MEMBERS)
{
AT_PROMOTION_MEMBER_KEY_VALUE MemberValue = new AT_PROMOTION_MEMBER_KEY_VALUE();
MemberValue.KEY_VALUE = upc;
db.AT_PROMOTION_MEMBER_KEY_VALUE.Add(MemberValue);
PROMOTION_MEMBER Member = new PROMOTION_MEMBER();
Member.LK_KEY_TYPE = db.LK_KEY_TYPE.Where(Type => Type.KEY_TYPESysID == 1).First();
Member.AT_PROMOTION_MEMBER_KEY_VALUE = MemberValue;
db.PROMOTION_MEMBER.Add(Member);
MP_PROMOTION_SET__PROMOTION_MEMBER Map_S_M = new MP_PROMOTION_SET__PROMOTION_MEMBER();
Map_S_M.PROMOTION_SET = GetSet;
Map_S_M.PROMOTION_MEMBER = Member;
db.MP_PROMOTION_SET__PROMOTION_MEMBER.Add(Map_S_M);
}
MP_PROMOTION__PROMOTION_SET Buy_Map_P_S = new MP_PROMOTION__PROMOTION_SET();
Buy_Map_P_S.PROMOTION = Promotion;
Buy_Map_P_S.PROMOTION_SET = BuySet;
db.MP_PROMOTION__PROMOTION_SET.Add(Buy_Map_P_S);
MP_PROMOTION__PROMOTION_SET Get_Map_P_S = new MP_PROMOTION__PROMOTION_SET();
Get_Map_P_S.PROMOTION = Promotion;
Get_Map_P_S.PROMOTION_SET = GetSet;
db.MP_PROMOTION__PROMOTION_SET.Add(Get_Map_P_S);
db.SaveChanges();
return Json("success");
}
这里是视图:
@model Promotion_Generator.Models.BOGOModel
@{
ViewBag.Title = "Buy One Get One";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2><b>Buy One Get One Free</b></h2>
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
<div class="form-horizontal">
<hr />
<div class="form-group">
<p class = "control-label col-md-2"><b>Promotion Code</b></p>
<div class="col-md-10 PC">
<input type="text" name="f-Promotion-Code" class="form-control f-Promotion-Code01" />
</div>
</div>
<div class="form-group">
<p class="control-label col-md-2"><b>Description</b></p>
<div class="col-md-10 Desc">
<input type="text" name="f-Description" class="form-control f-Description01" />
</div>
</div>
<div class="form-group">
<p class="control-label col-md-2"><b>Start Date Time</b></p>
<div class="col-md-10 SDT">
<input type="datetime" name="f-Start-Date-Time" class="form-control f-Start-Date-Time01" />
</div>
</div>
<div class="form-group">
<p class="control-label col-md-2"><b>End Date Time</b></p>
<div class="col-md-10 EDT">
<input type="datetime" name="f-End-Date-Time" class="form-control f-End-Date-Time01" />
</div>
</div>
<div class="form-group">
<p class="control-label col-md-2"><b>Percent Off</b></p>
<div class="col-md-10 PO">
<input type="number" name="f-Percent-Off" class="form-control f-Percent-Off01" />
</div>
</div>
<div class="form-group col-md-10">
<h3><b>Buy Products</b></h3>
<table class="table" id="buytable">
<thead>
<tr>
<th>Product UPC</th>
<th />
<th />
</tr>
</thead>
<tbody>
<tr class="data-buy">
<td>
<input type="number" name="f-upc" class="form-control f-upc01" />
</td>
</tr>
</tbody>
</table>
<button type="button" id="btnAdd" class="btn btn-primary btn-md pull-right btn-sm classBuyAdd">Add More</button>
</div>
<div class="form-group col-md-10">
<h3><b>Get Products</b></h3>
<table class="table" id="gettable">
<thead>
<tr>
<th>Product UPC</th>
<th />
<th />
</tr>
</thead>
<tbody>
<tr class="data-get">
<td>
<input type="number" name="f-upc" class="form-control f-upc01" />
</td>
</tr>
</tbody>
</table>
<button type="button" id="btnAdd" class="btn btn-primary btn-md pull-right btn-sm classGetAdd">Add More</button>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<button type="button" id="btnSubmit" value="Submit" class="btn btn-default">Submit</button>
</div>
</div>
</div>
}
<div>
@Html.ActionLink("Back to Home", "Index", "Home")
</div>
@section scripts{
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script type="text/javascript" src="http://ajax.cdnjs.com/ajax/libs/json2/20110223/json2.js"></script>
<script type="text/javascript">
$(document).ready(function () {
$(document).on("click", ".classBuyAdd", function () {
var rowCount = $('.data-contact-person').length + 1;
var contactdiv = '<tr class="data-buy">' +
'<td><input type="number" name="f-upc' + rowCount + '" class="form-control f-upc01" /></td>' +
'<td><button type="button" id="btnDelete" class="deleteContact btn btn btn-danger btn-xs">Remove</button></td>' +
'</tr>';
$('#buytable').append(contactdiv);
});
});
$(document).ready(function () {
$(document).on("click", ".classGetAdd", function () {
var rowCount = $('.data-contact-person').length + 1;
var contactdiv = '<tr class="data-get">' +
'<td><input type="number" name="f-upc' + rowCount + '" class="form-control f-upc01" /></td>' +
'<td><button type="button" id="btnDelete" class="deleteContact btn btn btn-danger btn-xs">Remove</button></td>' +
'</tr>';
$('#gettable').append(contactdiv);
});
});
$(document).on("click", ".deleteContact", function () {
$(this).closest("tr").remove();
});
function getAllData() {
var data = [];
$('div.PC').each(function () {
var upc = $(this).find('.f-Promotion-Code01').val();
data.push(upc);
});
$('div.Desc').each(function () {
var upc = $(this).find('.f-Description01').val();
data.push(upc);
});
$('div.SDT').each(function () {
var upc = $(this).find('.f-Start-Date-Time01').val();
data.push(upc);
});
$('div.EDT').each(function () {
var upc = $(this).find('.f-End-Date-Time01').val();
data.push(upc);
});
var UPC1 = []
$('tr.data-buy').each(function () {
var upc = $(this).find('.f-upc01').val();
UPC1.push(upc);
});
var UPC2 = [];
$('tr.data-get').each(function () {
var upc = $(this).find('.f-upc01').val();
UPC2.push(upc);
});
$('div.PO').each(function () {
var upc = $(this).find('.f-Percent-Off01').val();
data.push(upc);
});
var alldata = {
'PROMOTION_CODE': data[0],
'DESCRIPTION': data[1],
'START_DATE_TIME': data[2],
'END_DATE_TIME': data[3],
'BUY_MEMBERS': UPC1,
'GET_MEMBERS': UPC2,
'PERCENT_OFF': data[4],
}
console.log(alldata);
return alldata;
}
$("#btnSubmit").click(function () {
var data = JSON.stringify(getAllData());
console.log(data);
$.ajax({
url: 'BOGOSave',
type: 'POST',
dataType: 'json',
contentType: 'application/json; charset=utf-8',
data: JSON.stringify({ 'MemberData': data }),
success: function () {
alert("Data Added Successfully");
},
error: function () {
alert("Error while inserting data");
}
});
});
</script>
}
任何帮助将不胜感激。谢谢!
编辑 1:这是具体的错误消息: {"违反 PRIMARY KEY 约束 'PK__AT_PROMO__36BD5C21B6ADDCDF'。无法在对象 'dbo.AT_PROMOTION_MEMBER_KEY_VALUE' 中插入重复键。重复键值为 (0)。\r\n语句已终止。"}
架构太大以适合这篇文章,但这里是错误中提到的表格:
CREATE TABLE [AT_PROMOTION_MEMBER_KEY_VALUE] (
[PROMOTION_MEMBER_KEY_VALUESysID] int PRIMARY KEY NOT NULL,
[KEY_VALUE] bigint NOT NULL,
[sku] varchar(MAX) NULL,
[owner] varchar(10) NULL,
[owner_type] int FOREIGN KEY REFERENCES [LK_OWNER_TYPE] ([OWNER_TYPESysID]) NULL,
[product_group_type] varchar(10) NULL
);
【问题讨论】:
-
能否提供确切的错误信息?
-
还需要一个数据库模式,更具体地说 - 具有各自主键的表的列表。当您尝试在添加了多个具有相同主键的对象的上下文中运行
db.SaveChanges()时,就会出现您面临的问题,但是从您的代码中很难判断哪种特定对象类型出错了. -
我更新了帖子以包含您需要的内容。如果您还需要什么,请告诉我
-
我没有看到你在代码中填写了[PROMOTION_MEMBER_KEY_VALUESysID],它不是自动递增的?
-
如何将其设置为自动递增
标签: c# asp.net-mvc entity-framework