实体框架-在调用SaveChanges添加/删除实体之前从上下文获取更新的数据库集

问题描述

如果输入的日期已经在我数据库的表中,那么我目前有一段代码可以在日历上删除添加日期:

foreach (DateTime date in dates)
{
    var dateExists = myDBContext.CalendarDates.Where(x => x.CalendarTypeId == type && x.DateDue == date).FirstOrDefault();
    if(dateExists != null)
    {
        myDBContext.CalendaDates.Remove(dateExists);
    }
    else
    {
        CalendarDate newDate = new CalendarDate
        {
            CalendarTypeId = type,Date = date,};
        myDBContext.CalendarDates.Add(newDate);
    }
}

我想在致电SaveChanges()之前进行验证,以确保每个月和每年只能输入一个日期。尽管当我从上下文中调用CalendarDates DBSet时,似乎并未对其进行更新以包括和忽略新日期和删除日期:

var dates = myDBContext.CalendarDates.Select(x=> x.Date).ToList();
var uniqueDatesPerMonth = dates.Select(x => new DateTime(x.Year,x.Month,1)).distinct().ToList(); // This should include dates that have been added or removed as per the above code
if(dates.Count() != uniqueDatesPerMonth.Count())
{
    return false;
} else {
    myDBContext.SaveChanges();
}

是否可以在调用DBSet之前获取更新表的SaveChanges()

解决方法

最终发现有关存储实体以添加和删除实体的变更跟踪器。我最终使用它根据要添加到上下文中的内容来修改列表。现在可以正常工作了:

var changeTracker = myDBContext.ChangeTracker.Entries().ToList();
var dates = myDBContext.CalendarDates.Where(x => x.CalendarTypeId == type).ToList();

foreach(var entity in changeTracker)
{
    var addRemoveDate = (CalendarDate)entity.Entity;
    if(addRemoveDate.Id > 0)
    {
        timeAllocationDates.RemoveAll(x => x.Id == addRemoveDate.Id);
    }
    else
    {
        timeAllocationDates.Add(addRemoveDate);
    }
}

var uniqueDatesPerMonth = dates.Select(x => new DateTime(x.Date.Year,x.Date.Month,1)).Distinct().ToList();
if (dates.Count() != uniqueDatesPerMonth.Count())
{
    return false;
} 
else 
{
    myDBContext.SaveChanges();
}