Este es uno de los pocos problemas que son problemáticos con Entity Framework. Digamos que tiene una clase que se ve así:
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; }
}
Ahora, desea insertar un nuevo elemento:
using(var context = new YourContext())
{
context.MyEntities.Add(new MyEntity())
}
Entity Framework sabe cómo manejar una clave principal de incremento automático debido a la definición en EDMX. No intentará insertar un valor para el Id
propiedad. Sin embargo, en lo que respecta a Entity Framework, CreatedOn
tiene un valor:el DateTime
predeterminado . Debido a que Entity Framework no puede decir "bueno, tiene un valor pero debería ignorarlo", insertará activamente el registro con CreatedOn
valor de propiedad, omitiendo el valor predeterminado en la definición de su columna en su tabla.
No hay una manera fácil de hacer esto. Puede establecer activamente el CreatedOn
propiedad a DateTime.Now
cuando inserta ese elemento. O puede crear una interfaz y un par de métodos de extensión:
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())
}
Editar: Para ampliar este punto, la razón por la que este es un problema irresoluble es por el significado detrás de un autoincrement
campo y un campo con un default
restricción de valor. Un campo de incremento automático debería, por definición, ser manejado siempre por el servidor, usando una semilla y todo ese jazz. No puede especificar un valor para un campo de incremento automático en una inserción a menos que ha utilizado SET IDENTITY INSERT ON
. Sin embargo, un valor predeterminado es solo una sugerencia que dice "si no especifico ningún valor, use este". Debido a que los tipos de valor en .NET no pueden ser nulos, siempre habrá un valor y Entity Framework no puede inferir que el predeterminado valor para ese campo, en ese momento, significa que desea que esté predeterminado en el servidor SQL.