【问题标题】:How can I detach an entity before saving on Entity Framework如何在保存实体框架之前分离实体
【发布时间】:2021-01-30 11:49:51
【问题描述】:

所以我目前正在开发一个链接到数据库的 WPF 应用程序,并且我有一个方法,其中我有一个 for-each 循环,它遍历添加到我的购物篮中的每个项目并将这些项目添加到数据库,以便我可以打印收据。

当我在篮子中间有一件已售罄的商品时,我想停止 for-each 循环(不在任何其他商品中迭代)并显示一条消息,说明该商品缺货,以便用户可以编辑购物篮并删除该项目,然后再次打印收据。

当这种情况发生时,我收到一个错误,因为收据 ID 和一些项目已经添加(dbContext.Add(item))所以当用户再次点击打印收据时(修改售罄项目后),当我调用保存,我在实体上添加了数据,但尚未添加。

如果一件商品缺货,有什么方法可以将所有未保存的东西分开吗??

错误信息:

UpdateException: 无法确定主端 'Context.FK_Receipt_Item_Receipt' 关系。多个添加 实体可能具有相同的主键。

public void AddToDatabase()
{
    boolean canPrintReceipt = true;

    Receipt receipt= new Receipt
    {
        ID = Guid.NewGuid()
    };

    Db.Receipts.Add(receipt);

    foreach (KeyValuePair<string, int> entry in Basket)
    {
        Item item= new Item();
       
        if // item is out of stock
        {
            canPrintReceipt = false;
            break;
        }
        else //Add new Item
        {
            ...
            ...
            Db.Items.Add(item);
        }

        Receipt_Item receiptItems = new Receipt_Jugada
        {
            ReceiptID = receip.ID,
            ItemID = item.ID,
            ...,
            ...
        };
        Db.Receipt_Items.Add(receiptItems);
    }

    if (canPrintReceipt)
    {
        Db.SaveChanges();
        Basket.Clear();
    }
}

【问题讨论】:

标签: c# sql wpf entity-framework


【解决方案1】:

您最好的选择可能是使用交易。

开始交易。 如果您遇到缺货商品,请回滚交易,您可以在从购物车中移除缺货商品后再次运行该流程。

如果一切都有库存并且一切正常,您可以提交交易,一切都将保存到数据库中。

这是basics的链接。

祝你好运!

【讨论】:

  • 我尝试使用事务实现该方法,但我不知道我的代码中是否缺少某些内容,但我仍然收到相同的错误消息。当交易未提交时(因为它有一个缺货项目),我回滚,更新购物篮并再次运行我的代码,然后我的交易将在 context.SaveChanges() UpdateException: Unable to determine the principal end of the context. ''Context.FK_Receipt_Item_Receipt' ' 关系。多个添加的实体可能具有相同的主键。
  • 好的,您可能没有在尝试添加商品之前保存收据记录。尝试在 for 循环之前添加一个 db.SaveChanges 看看是否有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-24
  • 2016-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多