Reputation: 132618
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?
Upvotes: 13
Views: 7135
Reputation: 9954
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?
Upvotes: 5
Reputation: 364389
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.
Upvotes: 12
Reputation: 208
Have you tryed to set the DefaultValue of the Property in the Entity?
Upvotes: 0