Este é um dos poucos problemas que são problemáticos com o Entity Framework. Digamos que você tenha uma classe parecida com esta:
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; }
}
Agora, você deseja inserir um novo elemento:
using(var context = new YourContext())
{
context.MyEntities.Add(new MyEntity())
}
O Entity Framework sabe como lidar com uma chave primária de incremento automático devido à definição no EDMX. Ele não tentará inserir um valor para o
Id
propriedade. No entanto, no que diz respeito ao Entity Framework, CreatedOn
tem um valor:o padrão DateTime
. Como o Entity Framework não pode dizer "bem, ele tem um valor, mas devo ignorá-lo", ele inserirá ativamente o registro com o CreatedOn
valor da propriedade, ignorando o valor padrão em sua definição de coluna em sua tabela. Não há uma maneira fácil de fazer isso. Você pode definir ativamente o
CreatedOn
propriedade para DateTime.Now
quando você insere esse item. Ou você pode criar uma interface e um par de métodos de extensão: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 expandir este ponto, a razão pela qual este é um problema insolúvel é devido ao significado por trás de um
autoincrement
campo e um campo com um default
restrição de valor. Um campo de auto-incremento deve, por definição, sempre ser manipulado pelo servidor, usando uma semente e tudo mais. Você não pode especificar um valor para um campo de incremento automático em uma inserção a menos que você usou SET IDENTITY INSERT ON
. Um valor padrão, no entanto, é apenas uma dica que diz "se eu não especificar nenhum valor, use isso". Como os tipos de valor no .NET não podem ser nulos, sempre haverá um valor e o Entity Framework não pode inferir que o padrão valor para esse campo, naquele momento, significa que você deseja que ele seja padronizado no servidor SQL.