在交易中找不到实体

时间:2018-08-06 07:47:41

标签: c# entity-framework-6

我在使用此数据层方法时遇到问题

    public async Task<(bool HasFailed, IList<string> ErrorMessages)> ApproveBillCancelRequest(IEnumerable<string[]> billsToApprove,
        string userId, string operationId)
    {
        var callerInfo = Shared.CommonAcross.Helper.GetCaller();
        InfoScope($"{LayerName} -> {callerInfo.MethodName} -> Started", operationId, userId);

        var errorMessages = new List<string>();

        using (var context = new FocusConnection())
        {
            var transaction = context.Database.BeginTransaction();

            try
            {
                foreach (var billToApprove in billsToApprove)
                {
                    var targetBillNumber = billToApprove[0];
                    var targetPayModeId = int.Parse(billToApprove[1]);

                    var entityBill = context.BILL_INFO_CANCEL_REQUESTS
                        .SingleOrDefault(where =>
                            where.BILL_NUMBER == targetBillNumber &&
                            where.PAY_MODE_ID == targetPayModeId);

                    if (entityBill == null)
                    {
                        errorMessages.Add($"Bill #{billToApprove[0]}, payment #{billToApprove[1]} was not found for cancel approval");
                        continue;
                    }

                    entityBill.BILL_INFO.LAST_MODIFIED_BY = userId;
                    entityBill.BILL_INFO.STAMP_DATE = DateTime.Now;
                    entityBill.BILL_INFO.INPUT_STATUS = 0;

                    var cancelledBill = new BILL_INFO_CANCELED
                    {
                        BILL_NUMBER = entityBill.BILL_NUMBER,
                        PAY_MODE_ID = entityBill.PAY_MODE_ID,
                        CASHIER_ID = entityBill.CASHIER_ID,
                        CANCELED_DATE = entityBill.CANCEL_REQUEST_DATE,
                        CANCEL_REQUESTED_BY = entityBill.CANCEL_REQUESTED_BY,
                        CANCEL_APPROVED_BY = userId,
                        REMARKS = entityBill.CANCELATION_REASON
                    };

                    // Add cancelled bill
                    context.BILL_INFO_CANCELEDS.Add(cancelledBill);

                    // Remove cancellation request
                    context.BILL_INFO_CANCEL_REQUESTS.Remove(context.BILL_INFO_CANCEL_REQUESTS.Single(where =>
                        where.BILL_NUMBER == cancelledBill.BILL_NUMBER && where.PAY_MODE_ID == cancelledBill.PAY_MODE_ID));

                    await context.SaveChangesAsync();
                }

                transaction.Commit();
            }
            catch (Exception exp)
            {
                transaction?.Rollback();

                ErrorScope($"{LayerName} -> {callerInfo.MethodName} -> Exception [{exp.Message}]", exp, operationId, userId);
                errorMessages.Add($"{LayerName} -> {callerInfo.MethodName} -> Exception [{exp.Message}]");

                return (true, errorMessages);
            }
        }

        return (errorMessages.Any(), errorMessages);
    }

问题在于在ForEach循环中,正确检索并处理了第一条记录。但是,永远不会找到其余记录(entityBill == null),但它们在数据库中。我认为这与正在运行的事务有关。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

这是很难破解的。事实证明,在UI层上使用String.Splitting()时,在数组列表内的数组的第一个索引后面附加了一个额外的空间。所以我通过以下方式解决了这个问题:

var targetBillNumber = billToApprove[0].Trim();
var targetPayModeId = int.Parse(billToApprove[1].Trim());