Questo è uno dei pochi problemi problematici con Entity Framework. Supponi di avere una classe simile a questa:
public class MyEntity
{
// Id is a PK on the table with Auto-Increment
public int Id { get; set; }
// CreatedOn is a datetime, with a default value
public DateTime CreatedOn { get; set; }
}
Ora vuoi inserire un nuovo elemento:
using(var context = new YourContext())
{
context.MyEntities.Add(new MyEntity())
}
Entity Framework sa come gestire una chiave primaria di incremento automatico grazie alla definizione nell'EDMX. Non tenterà di inserire un valore per l'Id
proprietà. Tuttavia, per quanto riguarda Entity Framework, CreatedOn
ha un valore:il DateTime
predefinito . Poiché Entity Framework non può dire "beh, ha un valore ma dovrei ignorarlo", inserirà attivamente il record con CreatedOn
valore della proprietà, ignorando il valore predefinito nella definizione di colonna nella tabella.
Non esiste un modo semplice per farlo. Puoi impostare attivamente il CreatedOn
proprietà su DateTime.Now
quando inserisci quell'elemento. Oppure puoi creare un'interfaccia e una coppia di metodi di estensione:
public interface ICreatedOn
{
public DateTime CreatedOn { get; set; }
}
public partial class MyEntity : ICreatedOn
{
}
public static TEntity AsNew<TEntity>(this TEntity entity) where TEntity : ICreatedOn
{
if(entity != null)
entity.CreatedOn = DateTime.Now;
return entity;
}
using(var context = new YourContext())
{
context.MyEntities.Add(new MyEntity().AsNew())
}
Modifica: Per approfondire questo punto, il motivo per cui si tratta di un problema irrisolvibile è il significato dietro a un autoincrement
campo e un campo con un default
vincolo di valore. Un campo di incremento automatico dovrebbe, per definizione, essere sempre gestito dal server, usando un seme e tutto quel jazz. Non è possibile specificare un valore per un campo di incremento automatico su un inserto a meno che hai usato SET IDENTITY INSERT ON
. Un valore predefinito, tuttavia, è solo un suggerimento che dice "se non specifichi alcun valore, usa questo". Poiché i tipi di valore in .NET non possono essere null, ci sarà sempre un valore e Entity Framework non può dedurre che il predefinito il valore per quel campo, in quel momento, significa che vuoi che sia predefinito sul server SQL.