Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Entity Framework - os valores padrão não são definidos na tabela do sql server


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.