更新条目会向数据库添加一个新条目

时间:2018-07-24 23:04:47

标签: c# linq

我正在进行POST调用以将花添加到数据库中,但是如果if语句为true,我想更新另一个表中的记录。如果该语句不正确,那么它将毫无问题地添加花,但是当我尝试使用新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();
}

1 个答案:

答案 0 :(得分: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();

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