13

For example, most of my entities have DateCreated and DateModified fields. The defaults to these are set to GetUtcDate() in SQL Server.

If I try and create an entity and don't set these values, I get an exception saying it can't run the SQL insert because the date value is out of range. Makes sense because C# default dates are 1/1/0001 while SQL Server's minimum date is 1/1/1753.

So is there a way I can tell EF to either use the SQL Server default values, or to NOT try and insert columns which have not been set?

3 Answers 3

12

You must set StoreGeneratedPattern for those properties to Identity for DateCreated and Computed for DataModified. It is available in designer. Once you do that you cannot modify those values in your application - only database can set those properties. I wrote about this some article because this feature had bug before VS2010 SP1 but there are reports that it still doesn't work sometimes.

Sign up to request clarification or add additional context in comments.

9 Comments

Thanks, I did give that a try before posting this but it wasn't working. I'm using VS 2010 Ultimate, SP1 and EF4
In such case check that correct store generated pattern is set both in CSDL and SSDL part of EDMX file (you must open it as XML) because this is valid way to do that.
@Ladislav I am giving this another try, however I am getting errors about a Non-Nullable column getting mapped to a nullable entity property. Do you know what it's talking about?
Is any of these properties nullable?
@Rachel: In such case Computed will not work as well because neither computed or identity properties are included in insert / update SQL command. You will have to handle default value in the application if you need that.
|
5

One solution is to override your generated entitycontext class by using partial. This will intercept inserts/updates on all the entity classes in your EF context:

public partial class MyEntities : ObjectContext
{
    public override int SaveChanges(SaveOptions options)
    {
        this.DetectChanges();

        foreach (var insert in this.ObjectStateManager.GetObjectStateEntries(System.Data.EntityState.Added))
        {
            if (insert.Entity.HasProperty("DateCreated"))
                insert.Entity.GetType().GetProperty("DateCreated").SetValue(insert.Entity, DateTime.UtcNow, null);
            if (insert.Entity.HasProperty("LastModified"))
                insert.Entity.GetType().GetProperty("LastModified").SetValue(insert.Entity, DateTime.UtcNow, null);
        }

        foreach (var update in this.ObjectStateManager.GetObjectStateEntries(System.Data.EntityState.Modified))
        {
            if (update.Entity.HasProperty("LastModified"))
                update.Entity.GetType().GetProperty("LastModified").SetValue(update.Entity, DateTime.UtcNow, null);
        }

        return base.SaveChanges(options);
    }
}

Or do something similar, looking for inserts/updates on your datestamp fields and removing them from the ObjectStateEntries collection?

Comments

0

Have you tryed to set the DefaultValue of the Property in the Entity?

1 Comment

I'm really hoping to avoid having to go through all my entities and adjusting the default value of every property. Also, it means if I change the default in SQL server I need to change the default in EF and recompile

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.