【问题标题】:Not able to update the data in more than one table in Asp .net MVC5无法在 Asp .net MVC 5 中更新多个表中的数据
【发布时间】:2020-07-14 10:37:32
【问题描述】:

在这里,我可以将数据添加到多个表中。让我有 3 个表 User、Franchise 和 Fee。

我无法更新多个表中的数据,它会抛出异常:

发生参照完整性约束违规:关系一端的“User.Id”的属性值与另一端的“Franchise.UserId”的属性值不匹配。

代码:

public MessageResult SaveAndUpdateFranchisee(UserViewModel model)
        {
            var result = new MessageResult();
            try
            {
                User userData = new User();
                Franchise franchiseData = new Franchise(); 
                var ExistUser = db.Users.Where(a => a.Id == model.Id).FirstOrDefault();
                //Update record
                if (model.Id > 0)
                {
                    Fee feeData = new Fee
                    {
                        FranchiseeFee = model.FranchiseeFee,
                        PaymentTermsFranchiseFee = model.PaymentTermsFranchiseFee,
                        EquipmentCost = model.EquipmentCost,
                        PaymentTermsEquipmentCost = model.PaymentTermsEquipmentCost,
                        OtherFee = model.OtherFee,
                        PaymentTermsOtherFee = model.PaymentTermsOtherFee,
                        ConsumableStock = model.ConsumableStock,
                        PaymentTermsConsumableStock = model.PaymentTermsConsumableStock,
                        FrozenFoodStock = model.FrozenFoodStock,
                        PaymentTermsFrozenFoodStock = model.PaymentTermsFrozenFoodStock,
                        TotalAmountDue = model.TotalAmountDue,
                        TotalAmountPaid = model.TotalAmountPaid,
                        BalanceAmount = model.BalanceAmount,
                        LoyaltyFeePercentage = model.LoyaltyFeePercentage,
                        FixedMonthlyFee = model.FixedMonthlyFee,
                        Note = model.Note,
                        UserId = model.CurrentUserId,
                        LOIDocUrl = model.LOIDocUrl,
                        ModifiedDate = DateTime.Now 
                    };
                    ExistUser.Email = model.Email;
                    //var pwd = SecutiryServices.EncodePasswordToBase64(model.Password);
                    //userData.Password = pwd;
                    ExistUser.Password = model.Password;
                    ExistUser.FirstName = model.FirstName;
                    ExistUser.MiddleName = model.MiddleName;
                    ExistUser.LastName = model.LastName;
                    ExistUser.FullName = model.FullName;                    
                    ExistUser.MobileNo = model.MobileNo;
                    ExistUser.ModifyDate = DateTime.Now;

                    franchiseData.Name = model.FullName;
                    franchiseData.MobileNo = model.MobileNo;
                    franchiseData.AlternateNo = model.AlternetNo;
                    franchiseData.CompanyPhoneNo = model.PhoneNo;

                    franchiseData.Address = model.Address;
                    franchiseData.City = model.City;
                    franchiseData.State = model.State;
                    franchiseData.PinCode = model.PinCode;

                    franchiseData.CompanyName = model.CompanyName;
                    franchiseData.CompanyAddress = model.CompanyAddress;
                    franchiseData.CompanyCity = model.CompanyCity;
                    franchiseData.CompanyState = model.CompanyState;
                    franchiseData.CompanyAddress = model.CompanyAddress;
                    franchiseData.CompanyPinCode = model.CompanyPinCode;
                    franchiseData.ModifiedDate = DateTime.Now;
                    userData.Franchises.Add(franchiseData);
                    foreach (var item in userData.Franchises)
                    {                        
                        item.Fees.Add(feeData);
                    }
                    db.Users.Attach(userData);

                    db.Entry(userData).State = System.Data.Entity.EntityState.Modified;
                    //db.Users.Add(userData);

                    db.SaveChanges();
                    result.Message = "Your franchise has been updated successfully..";
                    result.Status = true;
                }
                //For Insert recored..
                else
                {
                    Fee feeData = new Fee
                    {
                        FranchiseeFee = model.FranchiseeFee,
                        PaymentTermsFranchiseFee = model.PaymentTermsFranchiseFee,
                        EquipmentCost = model.EquipmentCost,
                        PaymentTermsEquipmentCost = model.PaymentTermsEquipmentCost,
                        OtherFee = model.OtherFee,
                        PaymentTermsOtherFee = model.PaymentTermsOtherFee,
                        ConsumableStock = model.ConsumableStock,
                        PaymentTermsConsumableStock = model.PaymentTermsConsumableStock,
                        FrozenFoodStock = model.FrozenFoodStock,
                        PaymentTermsFrozenFoodStock = model.PaymentTermsFrozenFoodStock,
                        TotalAmountDue = model.TotalAmountDue,
                        TotalAmountPaid = model.TotalAmountPaid,
                        BalanceAmount = model.BalanceAmount,
                        LoyaltyFeePercentage = model.LoyaltyFeePercentage,
                        FixedMonthlyFee = model.FixedMonthlyFee,
                        Note = model.Note,
                        UserId = model.CurrentUserId,
                        LOIDocUrl = model.LOIDocUrl,
                        CreatedDate = DateTime.Now
                    };

                    userData.Email = model.Email;
                    //var pwd = SecutiryServices.EncodePasswordToBase64(model.Password);
                    //userData.Password = pwd;
                    userData.Password = model.Password;
                    userData.FirstName = model.FirstName;
                    userData.FullName = model.FirstName + " " + model.LastName;
                    userData.LastName = model.LastName;
                    userData.MobileNo = model.MobileNo;
                    userData.IsActive = true;
                    userData.IsDelete = false;                    
                    userData.CreatedDate = DateTime.Now;
                    userData.UserTypeId = 2;   

                    franchiseData.CompanyId = model.CurrentUserId;
                    franchiseData.Name = userData.FullName;
                    franchiseData.MobileNo = model.MobileNo;
                    franchiseData.AlternateNo = model.AlternetNo;
                    franchiseData.Address = model.Address;
                    franchiseData.City = model.City;
                    franchiseData.State = model.State;
                    franchiseData.PinCode = model.PinCode;
                    franchiseData.CompanyName = model.CompanyName;
                    franchiseData.CompanyPhoneNo = model.PhoneNo;
                    franchiseData.CompanyAddress = model.CompanyAddress;
                    franchiseData.CompanyCity = model.CompanyCity;
                    franchiseData.CompanyState = model.CompanyState;
                    franchiseData.CompanyAddress = model.CompanyAddress;
                    franchiseData.CompanyPinCode = model.CompanyPinCode;
                    franchiseData.CreatedDate = DateTime.Now;
                    franchiseData.IsActive = true;

                    userData.Franchises.Add(franchiseData);
                    foreach (var item in userData.Franchises)
                    {
                        item.Fees.Add(feeData);
                    }
                    db.Users.Add(userData);
                    db.SaveChanges();
                    //db.AddUserRole(userData.Id, 4);                  
                    result.Message = "Your franchisee has been created successfully..";
                    result.Status = true;
                }
                return result;
            }
            catch (Exception ex)
            {
                result.Message = "We are unable to process your request at this time. Please try again later.";
                result.Status = false;
                return result;
            }
        }

【问题讨论】:

  • 您使用的是哪个版本的实体框架?您使用的是数据库优先还是代码优先? FOREIGN KEY CONSTRAINT 关系的定义是什么?

标签: sql-server entity-framework asp.net-mvc-5


【解决方案1】:

错误消息很简单 - 您的代码正在创建一个新的 Franchise 对象,但它从未设置 franchiseData.UserId 属性。

在您致电db.SaveChanges() 之前,将此添加到您的franchiseData 人口代码中:

franchiseData.UserId = model.CurrentUserId;

顺便说一句,您应该添加代码验证当前用户是否有权直接从从提交的表单中读取的值设置外键引用属性(如 UserId),否则任何用户都可以输入属于其他用户的 Id 值并获得他们不应访问的信息 - 或以其他方式更改您的数据库。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-16
    • 1970-01-01
    • 2013-12-16
    • 1970-01-01
    • 1970-01-01
    • 2016-05-16
    • 2016-05-30
    • 2017-09-16
    相关资源
    最近更新 更多