C# EF:6-如果值在DB中设置了默认值,如何跳过值的插入?
我正在与EntityFramework6和MySQl数据库进行斗争 我把一切都安排好了,但是我对日期和非强制性的价值观感到困惑 在我的数据库中,在Users表中有RegistrationDate列,其默认值为CURRENT_TIMESTAMP 如果在插入时未提供值,它将插入默认值=服务器的日期时间,这意味着什么 我将我的模式反向工程到C中,所有这些都非常有效,但是,当我插入用户而不将日期设置为RegistrationDate属性时,它会将新日期插入数据库0001-01-01 00:00:00,并忽略当前的时间戳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,并
因此,我想知道如何将其设置为忽略注册日期,并且如果未特别设置为某个日期,则不在数据库中插入任何内容?我认为我们中的许多人在处理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时依赖于数据库。