【问题标题】:Duplicate Entity error when saving db even when the database is empty即使数据库为空,保存数据库时也会出现重复实体错误
【发布时间】: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


【解决方案1】:

好的,我解决了这个问题。事实证明,我没有自动增加主键,并且由于我没有手动设置它,所以它始终为 0。即使数据库中没有任何内容,它仍然无法插入,因为我正在尝试创建两个项目,他们有相同的ID。感谢帮助解决这个问题的 cmets。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-20
    • 1970-01-01
    相关资源
    最近更新 更多