我正在做一个项目,跟踪员工在不同团队之间工作的时间。该应用程序的工作方式是,员工提交一个Daysheet表单,其中包含他们的签到和签退时间以及他们的现场经理(FMId)的id。每个字段管理器在数据库中都有一个列,用于跟踪与其FMId一起提交的表单的DaysheetIds。问题是这个列只保存了提交的第一个DaysheetId。一旦该列中有一个值,字段管理器就不会更新以添加任何其他DaysheetIds。
为了使我的帖子保持简洁,我试图只张贴相关的代码,但如果我遗漏了一些重要的东西,请让我知道。
下面是我的控制器中应该更新Field Manager的操作。我在返回之前添加了var FM,以查看调试器在Field Manager上发生了什么。
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方法,它在控制器操作中被调用:
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的样子:
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中包含了以下内容
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出了什么问题,但我在另一个项目中使用了相同的代码,并且没有这个问题,所以我被困在了该怎么办的问题上。
发布于 2021-02-15 06:42:35
我没有正确理解您的问题,但是如果您希望在数据库中更新或插入一些数据,您可以使用_applicationDbContext.ApplicationUsers.add(fieldManager);进行插入,使用_applicationDbContext.Entry(fieldManager).State = EntityState.Modeified;进行更新。但是在_applicationDbContext.SaveChanges()之前你没有用过它们中的任何一个。
我认为你必须这样写:
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;https://stackoverflow.com/questions/66200258
复制相似问题