首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在字段中已存在值后,ApplicationUser不会保存对该字段的更改

在字段中已存在值后,ApplicationUser不会保存对该字段的更改
EN

Stack Overflow用户
提问于 2021-02-15 05:21:01
回答 1查看 36关注 0票数 0

我正在做一个项目,跟踪员工在不同团队之间工作的时间。该应用程序的工作方式是,员工提交一个Daysheet表单,其中包含他们的签到和签退时间以及他们的现场经理(FMId)的id。每个字段管理器在数据库中都有一个列,用于跟踪与其FMId一起提交的表单的DaysheetIds。问题是这个列只保存了提交的第一个DaysheetId。一旦该列中有一个值,字段管理器就不会更新以添加任何其他DaysheetIds。

为了使我的帖子保持简洁,我试图只张贴相关的代码,但如果我遗漏了一些重要的东西,请让我知道。

下面是我的控制器中应该更新Field Manager的操作。我在返回之前添加了var FM,以查看调试器在Field Manager上发生了什么。

代码语言:javascript
复制
public IActionResult Submit(EmployeeDaySheetViewModel employeeDaySheetViewModel)
        {
            if (ModelState.IsValid)
            {
                var newDaySheet = new EmployeeDaySheet
                {
                    Id = employeeDaySheetViewModel.DaysheetId,
                    EmployeeId = employeeDaySheetViewModel.EmployeeId,
                    EmployeeName = employeeDaySheetViewModel.EmployeeName,
                    FMId = employeeDaySheetViewModel.FMId,
                    Date = employeeDaySheetViewModel.Date,

                    ClockIn = employeeDaySheetViewModel.ClockIn,
                    ClockOut = employeeDaySheetViewModel.ClockOut,
                };
                var success = _employeeDaySheetRepository.AddDaySheet(newDaySheet);
                if (success)
                {
                    _applicationUserRepository
                        .AddCrewDaySheetToFieldManager(employeeDaySheetViewModel.FMId,
                                                        employeeDaySheetViewModel.DaysheetId);
                    TempData["UserMessage"] = "Successfully submitted daysheet for " + DateTime.Now.Day.ToString();
                }
                else
                {
                    TempData["ErrorMessage"] = "Unable to submit daysheet.  Please try again in a few minutes.";
                }

            }
            var FM = _applicationUserRepository.GetFieldManagerById(employeeDaySheetViewModel.FMId);
            return Redirect("/home/");

下面是我的用户存储库中的AddCrewDaySheetToFieldManager方法,它在控制器操作中被调用:

代码语言:javascript
复制
public bool AddCrewDaySheetToFieldManager(string FMId, string DaySheetId)
        {
            var fieldManager = _applicationDbContext.ApplicationUsers
                .FirstOrDefault(u => u.Id == FMId);
            if (fieldManager.CrewDaySheetIds != null)
                
                {
                    var oldCrewIds = fieldManager.CrewDaySheetIds;

                    // If the user deletes all their crewIds, the database leaves an empty string in their crewIds column.
                    // Replacing user.crewIds that has "" at index 0 is the same as starting a new list.
                    if (oldCrewIds[0] == "")
                    {
                        var newCrewIds = new List<string> { DaySheetId };
                        fieldManager.CrewDaySheetIds = newCrewIds;
                    }
                    else
                    {
                        fieldManager.CrewDaySheetIds.Add(DaySheetId);
                    }
                }
            else { fieldManager.CrewDaySheetIds = new List<string> { DaySheetId }; }
            _applicationDbContext.SaveChanges();
            return true;

这是我的ApplicationUser的样子:

代码语言:javascript
复制
public class ApplicationUser : IdentityUser
    {
        public string Tier { get; set; }
        public bool IsFieldManager { get; set; }
        public double HourRate { get; set; }

        public string FirstName { get; set; }
        public string LastName { get; set; }

        public List<string> PayrollObjectIds { get; set; }
        public List<string> CrewDaySheetIds { get; set; }

    }

为了将这个对象的列表属性转换为字符串,我在我的DbContext中包含了以下内容

代码语言:javascript
复制
protected override void OnModelCreating(ModelBuilder builder)
        {
            var splitStringConverter = new ValueConverter<List<string>, string>(v => string.Join(";", v), v => v.Split(new[] { ';' }).ToList());
            builder.Entity<ApplicationUser>().Property(nameof(ApplicationUser.PayrollObjectIds)).HasConversion(splitStringConverter);
            builder.Entity<ApplicationUser>().Property(nameof(ApplicationUser.CrewDaySheetIds)).HasConversion(splitStringConverter);

            base.OnModelCreating(builder);

           //I also seed some data here//
        }

我不能确定的是数据在什么时候不会被保存。当我运行调试器时,我可以看到fieldManager正在更新。在AddCrewDaySheetToFieldManager方法中,fieldManager.CrewDaySheetIds具有DaysheetId。然后,回到行动中,就在return Redirect('/home/')之前,FM.CrewDaySheetIds仍然拥有DaysheetId。但是,当我查看数据库或尝试访问FM用户的CrewDaysheetIds时,只有第一个DaysheetId在那里。

我怀疑splitStringConversion出了什么问题,但我在另一个项目中使用了相同的代码,并且没有这个问题,所以我被困在了该怎么办的问题上。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-15 06:42:35

我没有正确理解您的问题,但是如果您希望在数据库中更新或插入一些数据,您可以使用_applicationDbContext.ApplicationUsers.add(fieldManager);进行插入,使用_applicationDbContext.Entry(fieldManager).State = EntityState.Modeified;进行更新。但是在_applicationDbContext.SaveChanges()之前你没有用过它们中的任何一个。

我认为你必须这样写:

代码语言:javascript
复制
    public bool AddCrewDaySheetToFieldManager(string FMId, string DaySheetId)
        {
            var fieldManager = _applicationDbContext.ApplicationUsers
                .FirstOrDefault(u => u.Id == FMId);
            if (fieldManager.CrewDaySheetIds != null)
                
                {
                    var oldCrewIds = fieldManager.CrewDaySheetIds;

                    // If the user deletes all their crewIds, the database leaves an empty string in their crewIds column.
                    // Replacing user.crewIds that has "" at index 0 is the same as starting a new list.
                    if (oldCrewIds[0] == "")
                    {
                        var newCrewIds = new List<string> { DaySheetId };
                        fieldManager.CrewDaySheetIds = newCrewIds;
                    }
                    else
                    {
                        fieldManager.CrewDaySheetIds.Add(DaySheetId);
                    }
                }
            else { fieldManager.CrewDaySheetIds = new List<string> { DaySheetId }; }
            _applicationDbContext.entry(fieldManager).State = EntityState.Modified;
            _applicationDbContext.SaveChanges();
            return true;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66200258

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档