Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EF:6-如果值在DB中设置了默认值,如何跳过值的插入?_C#_Mysql_Entity Framework - Fatal编程技术网

C# EF:6-如果值在DB中设置了默认值,如何跳过值的插入?

C# EF:6-如果值在DB中设置了默认值,如何跳过值的插入?,c#,mysql,entity-framework,C#,Mysql,Entity Framework,我正在与EntityFramework6和MySQl数据库进行斗争 我把一切都安排好了,但是我对日期和非强制性的价值观感到困惑 在我的数据库中,在Users表中有RegistrationDate列,其默认值为CURRENT_TIMESTAMP 如果在插入时未提供值,它将插入默认值=服务器的日期时间,这意味着什么 我将我的模式反向工程到C中,所有这些都非常有效,但是,当我插入用户而不将日期设置为RegistrationDate属性时,它会将新日期插入数据库0001-01-01 00:00:00,并

我正在与EntityFramework6和MySQl数据库进行斗争

我把一切都安排好了,但是我对日期和非强制性的价值观感到困惑

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

我将我的模式反向工程到C中,所有这些都非常有效,但是,当我插入用户而不将日期设置为RegistrationDate属性时,它会将新日期插入数据库0001-01-01 00:00:00,并忽略当前的时间戳


因此,我想知道如何将其设置为忽略注册日期,并且如果未特别设置为某个日期,则不在数据库中插入任何内容?

我认为我们中的许多人在处理EF时被默认的数据库值抓住了-它没有考虑到它们-在这方面有很多问题-例如


我想说,如果没有显式地设置datetime并希望它为null,则需要在代码中进行设置。

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

,表示有一个DatabaseGenerated属性,您可以这样使用:

[DatabaseGenerated(DatabaseGenerationOption.Computed)]
public DateTime RegistrationDate { get; set; }
因此,EF现在知道在查询数据库时应该检索数据,但应该依赖数据库来设置值

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

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

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

//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.

        }

    }



}

超级的这正是我要问的!非常感谢你!刚刚做了一个测试,效果很好!谢谢,但你能帮我做个小测试吗?尝试显式设置该值,看看会发生什么。我想它会忽略您设置的值。只是想看看它的行为-我也对这个线程感兴趣:DUhhh:你说得对,它现在完全忽略了值,即使它被设置了。不幸的是,我现在不能把你们的答案标记为:没问题。正如我所看到的,这不是一个微不足道的问题。我在实体框架本身中看到了一些解决方案,它不依赖于数据库。我会修改我的问题,但我仍然认为这不是你想要的。而且,它依赖于反射。编辑制作!它不依赖于数据库,但我认为可以使用IsModified=false属性来实现相同的结果,在值为null时依赖于数据库。