【问题标题】:Db.SaveChanges() not saving correctly at release modeDb.SaveChanges() 在发布模式下无法正确保存
【发布时间】:2017-12-18 19:23:39
【问题描述】:

我正在尝试将复选框保存到数据库。它可以在调试模式下正常工作,但如here 所解释的那样,在没有代码优化的情况下切换到发布或自定义发布不会。 Db 是 Sqlite。使用 DB Browser 查找 SQLite SimpleCheck 字段在发布时为 NULL 或 0,在调试时为 NULL、0 或 1。 (已编辑)

        private void SetSingleCheck(CheckBox box)
    {
        var processId = (int)box.Tag;
        using (var db = new AgendaContext())
        {
            var check = db.Checks.SingleOrDefault(c => (c.ProcessId == processId) && (c.Date.Date == SelectedDate.Date.Date));
            if (null == check)
            {
                check = new Check()
                {
                    ProcessId = processId,
                    Date = SelectedDate.Date
                };
                db.Checks.Add(check);
            }
            if  (box.IsChecked.HasValue)
            {
                check.SimpleCheck = box.IsChecked.Value;
            }                
            db.SaveChanges();
        }
    }

模型的相关部分,以防万一:

    public class Check //Check if this process is ok or not, TODAY
{
    public int CheckId { get; set; }        
    public DateTimeOffset Date { get; set; }
    public Process Process { get; set; }
    public int ProcessId { get; set; }
    public bool? SimpleCheck { get; set; } //USed for checked situations. example: clean this thing: Ok, i have cleaned it.
    public bool? DoubleCheck { get; set; } //Used for ok/no ok after doing something.
    public ObservableCollection<Temperature>Temperatures { get; set; }
}
        public DbSet<Check>Checks { get; set; }

出了什么问题或遗漏了什么?谢谢。

【问题讨论】:

  • 所以你已经在发布模式下单步执行了代码,它进入了上面的 SetSingleCheck 方法,box.IsChecked 有一个值在 SaveChanges 调用之前进入 SimpleCheck,并且没有有什么异常被抛出/吃掉吗?只是为了澄清一下,通过检查“HasValue”,您基本上是在说复选框将默认为不确定状态,只有当用户单击它以将其设置为真、假(或返回不确定)时,SimpleCheck 才会更新。如果它是 True 或 False,SimpleCheck 将是“true”。如果保留为不确定,则为“False”。
  • 对,没有抛出异常。对不起,这个错误你是对的,最近犯了这个错误,但之前通过使用 check.simplecheck = box.IsChecked().Value 设置它不起作用我的意思是它可以为 null 但这个方法的默认值是错误的。 "如果选中了 ToggleButton,则为 true;如果未选中 ToggleButton,则为 false;否则为 null。默认为 false。"
  • 所以那里的断点被击中并调用了 SaveChanges?在调查此类问题时,我通常会在 SaveChanges 调用上使用断点,在 SaveChanges 执行之前检查数据(如果是更新),然后在 SaveChanges 之后立即检查它以验证记录更改是否持续,然后再让它继续。在某些情况下,罪魁祸首是在堆栈中执行和撤消更改或竞争条件的进一步代码。 (单步执行时有效,无人看管时失败。)
  • 是的,它被调用并且数据似乎一直都正常。抓住它是什么,将在回答中解释,谢谢。

标签: entity-framework sqlite uwp


【解决方案1】:

错误源在模型中

public bool? SimpleCheck { get; set; }

由于 sqlite 中没有布尔值,如果 ef 核心转换器可以为空,它似乎会在某处失败,如果为 false,它分配 null,如果为 true,则分配 0,而预期结果是 0 和 1。在测试解决方案中重现。只是让它不可为空并在代码中调整空检查就可以了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多