簡體   English   中英

實體框架SaveChanges()錯誤?

[英]Entity Framework SaveChanges() bug?

我有一個CRUD應用程序,處理兩個對象,卡和日志。 用戶創建,編輯或刪除卡時,將在數據庫的日志表中創建一個新的日志記錄。 用戶創建卡時,日志記錄的NewCard值為JSON數據,而OldCard值為null。 當用戶刪除卡時,日志記錄的OldCard值為JSON數據,而NewCard為空。

但是,無論何時刪除卡,Entity Framework都會創建此額外的記錄,並用紅色圓圈圈出:

在此處輸入圖片說明

記錄2101是IActionResult Create CreateNewLog(card, null)之后的結果。 記錄2102和2103是IActionResult Delete CreateNewLog(null, oldCard)之后的結果。 記錄2103是問題。 如何停止創建此記錄?

CardController.cs

    private ICardData _cardData;
    private ILogData _logData;

    public CardController(ICardData cardData, ILogData logData)
    {
        _cardData = cardData;
        _logData = logData;
    }

    // POST api/card
    [HttpPost]
    public IActionResult Create([FromBody] Card card)
    {
        try
        {
            if (ModelState.IsValid)
            {
                _cardData.Add(card);
                CreateNewLog(card, null);

                Response.StatusCode = (int)HttpStatusCode.Created;
                return Json(new { Data = card });
            }
        }
        catch (Exception ex)
        {
            Response.StatusCode = (int)HttpStatusCode.BadRequest;
            return Json(new { Message = ex.Message });
        }

        return Json("Failed");
    }

    // DELETE api/card/1
    [HttpDelete("{id}")]
    public void Delete(int id)
    {
        Card oldCard = _cardData.Get(id).ShallowCopy();
        CreateNewLog(null, oldCard);

        _cardData.Delete(id);
    }

    public void CreateNewLog(Card newCard, Card oldCard)
    {
        Log newLog = new Log()
        {
            DateChanged = DateTime.Now,

            CardId = newCard == null ? oldCard.CardId : newCard.CardId,
            OldCard = JsonConvert.SerializeObject(oldCard),
            NewCard = JsonConvert.SerializeObject(newCard),
            User = "John Smith"
        };

        _logData.Add(newLog);
    }

LogData.cs

public class SqlLogData : ILogData
{
    private LitmusDbContext _context;

    public SqlLogData(LitmusDbContext context)
    {
        _context = context;
    }

    public IEnumerable<Log> GetAll()
    {
        return _context.Logs.ToList();
    }

    public Log Get(int id)
    {
        return _context.Logs.FirstOrDefault(c => c.Id == id);
    }

    public void Add(Log newLog)
    {
        _context.Add(newLog);
        _context.SaveChanges();
    }

}

CardData.cs

public class SqlCardData : ICardData
    {
        private LitmusDbContext _context;

        public SqlCardData(LitmusDbContext context)
        {
            _context = context;
        }

        public IEnumerable<Card> GetAll()
        {
            return _context.Cards.ToList();
        }

        public Card Get(int id)
        {
            Card card = _context.Cards.FirstOrDefault(c => c.Id == id);

            return card;
        }

        public void Add(Card newCard)
        {
            _context.Add(newCard);
            _context.SaveChanges();
        }

        public int Commit()
        {
            _context.SaveChanges();
            return 0;
        }

        public void Update(Card newCard)
        {
            var oldCard = Get(newCard.Id);

            if (oldCard != null)
            {
                oldCard.CardId = newCard.CardId;
                oldCard.State = newCard.State;
                _context.SaveChanges();
            }
        }

        public void Delete(int id)
        {
            var cardToDelete = Get(id);

            _context.Remove(cardToDelete);
            _context.SaveChanges();
        }
    }

根據所提供的代碼,我看不出這怎么可能。 新卡和舊卡都不會同時提供給CreateNewLog函數,但是有些東西正在將序列化卡保存到舊/新列中。

您可以在CreateNewLog函數中放置一個斷點並找出提供兩個參數的時間,然后查看調用堆棧嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM