【问题标题】:Updating entry adds a new entry to database更新条目将新条目添加到数据库
【发布时间】:2018-07-24 23:04:46
【问题描述】:

我正在进行 POST 调用以向数据库中添加一朵花,但如果 if 语句为真,我想更新另一个表中的记录。如果声明不正确,它会毫无问题地添加花朵,但是当我尝试使用新 ID 更新 PinkRoseId 时,它会创建一条新记录而不是更新旧记录。

还有其他方法可以更新数据库吗?

public void AddFlower(Flower flowerToAdd, int someId)
{
    _flowerContext = _contextUtility.GetFlowerContext(flowerToAdd.FlowerName);
    var pinkRoseId = _flowerService.GetFlowerIdByName(flowerToAdd.FlowerName, "PinkRose", "Rose");

    if (flowerToAdd.SomeFlowerId.HasValue)
    {
        var flowerToUpdate = _updateService.UpdateFlowerBySomething(flowerToAdd.FlowerName, flowerToAdd.SomeFlowerId.Value, flowerToAdd.PetalAk);
        flowerToUpdate.PinkRoseId = pinkRoseId;
        _flowerContext.SaveChanges();
    }

    var firstId  = _petalService.GetFlowerIdByName(flowerToAdd.FlowerName, "rose", "petal");
    var secondId = _sunService.GetSunIdByTypeOf(flowerToAdd.FlowerName, flowerToAdd.SomeName, "sun");

    flowerToAdd.FlowerId        = secondId;
    flowerToAdd.SomeOtherId     = firstId;
    flowerToAdd.CreatedDate     = DateTime.UtcNow;
    flowerToAdd.CreatedByUserID = someId;

    _flowerContext.Flowers.Add(flowerToAdd);
    _flowerContext.SaveChanges();
}

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    在阅读有关实体框架的更多信息时,有一个方法 AddOrUpdate 可以添加新记录或更新任何现有记录。旁注:我使用的是 EF6(不确定 AddOrUpdate 是否在任何旧版本中可用)

    解决方案 1

    if (flowerToAdd.SomeFlowerId.HasValue)
    {
        var flowerToUpdate = _updateService.UpdateFlowerBySomething(flowerToAdd.FlowerName, flowerToAdd.SomeFlowerId.Value, flowerToAdd.PetalAk);
    }
    

    _flowerContext.Flower.AddOrUpdate(flowerToUpdate); -- 这成功了,更新了现有记录而不是添加新记录

    根据我的理解,强烈建议不要使用此方法,因为它可以添加新记录。尚未找到其他解决方案。

    解决方案 2

    我想出了另一种不使用AddOrUpdate 的方法来完成这项工作

    var changeRequest = (from x in _flowerContext.FlowerUpdateSomething
                         where x.FlowerPrimaryId == flowerToUpdate.FlowerPrimaryId
                         select x).FirstOrDefault();
    
    changeRequest.PinkRoseId = pinkRoseId;
    _flowerContext.SaveChanges();
    

    }

    解决方案 2 的更新:

    我将解决方案复制到另一个服务(例如 SunFlowerService),如下所示:

    public SomeDataBaseEntity UpdateFlower(int id) 
    {
        var changeRequest = (from x in _flowerContext.FlowerUpdateSomething
                             where x.FlowerPrimaryId == id
                             select x).FirstOrDefault();
    }
    

    但是现在当我像下面这样调用这个方法时:

    if (flowerToAdd.SomeFlowerId.HasValue)
    {
        var flowerToUpdate = _updateService.UpdateFlowerBySomething(flowerToAdd.FlowerName, flowerToAdd.SomeFlowerId.Value, flowerToAdd.PetalAk);
        var update = _someOtherService.UpdateFlower(flowerToUpdate.Id);
    
        update.PinkFlowerId = pinkFlowerId;
        _flowerContext.SaveChanges();
    }
    

    它不会更新数据库中的记录。我不知道如何解决这个问题,或者为什么会有这样的行为。但是保留原始 LINQ 查询如下:

    var changeRequest = (from x in _flowerContext.FlowerUpdateSomething
                         where x.FlowerPrimaryId == flowerToUpdate.FlowerPrimaryId
                         select x).FirstOrDefault();
    
     changeRequest.PinkRoseId = pinkRoseId;
    _flowerContext.SaveChanges();
    

    我能够更改数据库中的记录。不知道为什么制作另一种方法不起作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-30
      • 2021-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-01
      • 1970-01-01
      • 2021-06-15
      相关资源
      最近更新 更多