【问题标题】:EF:6 - How to skip insertion of value if value has default value set in DB?EF:6 - 如果值在 DB 中设置了默认值,如何跳过插入值?
【发布时间】:2015-01-25 11:59:06
【问题描述】:

我正在与 Entity Framework 6 和 MySQl 数据库作斗争

我得到了一切工作,但我对日期或非强制性值感到困惑。

在我的数据库中,在“用户”表中,我有一列“RegistrationDate”,其默认值为“CURRENT_TIMESTAMP” 这意味着如果在插入时未提供值,它将插入默认值 = 服务器的日期时间

我将我的架构逆向工程到 C# 并且一切正常,但是当我插入“用户”而不将日期设置为“注册日期”属性时,它会将新日期插入到数据库中作为“0001-01-01 00:00: 00”并忽略“CURRENT_TIMESTAMP”。

所以我想知道如何将其设置为忽略“RegistrationDate”,如果没有专门设置为某个日期,则不向数据库中插入任何内容?

【问题讨论】:

    标签: c# mysql entity-framework


    【解决方案1】:

    我猜测 SQL EF 生成的是设置字段值。即使你不在代码中设置,EF也不知道数据库有默认值,也不知道他应该忽略它。

    This article,从 2011 年开始,表示有一个 DatabaseGenerated 属性,您可以像这样使用它:

    [DatabaseGenerated(DatabaseGenerationOption.Computed)]
    public DateTime RegistrationDate { get; set; }
    

    所以,EF 现在知道它应该在查询数据库时检索数据,但应该依赖数据库来设置值。

    但是,如果您明确设置该值,我不知道它会做什么。也许它会忽略它,这可能不是你真正想要的。

    我没有测试它,这只是一个猜测,但在我看来这是一个不错的解决方案。

    [Edit1] 几个月前,我在 49:12 看到了 this video,这家伙在他的 DbContext 课程中做了这样的事情(我相信你有)(视频在葡萄牙语)(我修改了代码,但没有测试):

    //This method will be called for every change you do - performance may be a concern
    public override int SaveChanges()
    {
        //Every entity that has a particular property
        foreach (var entry in ChangeTracker.Entries().Where(entry => entry.Entity.GetType().GetProperty("YourDateField") != null))
        {
    
            if (entry.State == EntityState.Added)
            {
                var date = entry.Property("YourDateField");
    
                //I guess that if it's 0001-01-01 00:00:00, you want it to be DateTime.Now, right?
                //Of course you may want to verify if the value really is a DateTime - but for the sake of brevity, I wont.
                if (date.CurrentValue == default(DateTime))
                {
                    date.CurrentValue = DateTime.Now;
                }   
                else //else what? 
                {
    
                    //Well, you don't really want to change this. It's the value you have set. But i'll leave it so you can see that the possibilities are infinite!
    
                }
            }
    
    
            if (entry.State == EntryState.Modified)
            {
                //If it's modified, maybe you want to do the same thing.
    
                //It's up to you, I would verify if the field has been set (with the default value cheking)
                //and if it hasn't been set, I would add this:
    
                date.IsModified = false;
    
                //So EF would ignore it on the update SQL statement.
    
            }
    
        }
    
    
    
    }
    

    【讨论】:

    • 超级!这正是我要问的!非常感谢!刚刚做了一个测试,效果很不错!
    • 谢谢,你能帮我做个小测试吗?尝试显式设置该值,看看会发生什么。我猜它会忽略你设置的值。只是想看看它的行为 - 我也对这个线程感兴趣:D
    • Uhhh :( 你说得对,它现在完全忽略了价值,即使它已经设置了特异性。不幸的是,我现在不能将你的答案标记为答案:(
    • 没问题。正如我所看到的,这不是一个小问题。我在实体框架本身中看到了一些不依赖数据库的解决方案。我会编辑我的问题,但我仍然认为这不是你想要的。此外,它依赖于反射。
    • 编辑完成!它不依赖数据库,但我认为您可以使用IsModified = false 属性来实现相同的结果,当值为空时依赖数据库。
    【解决方案2】:

    我认为我们中的许多人在处理 EF 时都被默认数据库值所吸引 - 它没有考虑到它们(对此有很多问题 - 例如Entity Framework - default values doesn't set in sql server table

    我会说,如果您没有明确设置日期时间并希望它为空,则需要在代码中进行。

    【讨论】:

      猜你喜欢
      • 2011-03-09
      • 2017-07-17
      • 1970-01-01
      • 1970-01-01
      • 2011-07-23
      • 1970-01-01
      • 1970-01-01
      • 2014-10-27
      • 2017-12-05
      相关资源
      最近更新 更多