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

时间:2015-01-25 00:24:54

标签: c# mysql entity-framework

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

我把一切都搞定了,但是我对日期或非强制性价值观感到困惑。

在我的数据库中,"用户" table我有专栏" RegistrationDate"其默认值为" CURRENT_TIMESTAMP" 是什么意思是如果在插入时没有提供值,它将插入默认值=服务器的日期时间

我将我的架构逆向工程设计为C#并且完全正常工作,但是当我插入" User"没有设置日期" RegistrationDate"属性,它插入数据库的新日期为" 0001-01-01 00:00:00"并忽略" CURRENT_TIMESTAMP"。

所以我想知道如何设置它忽略" RegistrationDate"如果没有专门设置为某个日期,请不要在db中插入任何内容?

2 个答案:

答案 0 :(得分:3)

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

从2011年开始,

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

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

因此,EF现在知道它应该在查询数据库时检索数据,但是应该依靠数据库来设置值。

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

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

[Edit1] 几个月前,我看到了this video,这家伙在他的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.

        }

    }



}

答案 1 :(得分:1)

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

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