Alguém sabe como posso especificar o valor padrão para uma propriedade DateTime usando o atributo System.ComponentModel DefaultValue?
por exemplo, eu tento isso:
[DefaultValue(typeof(DateTime),DateTime.Now.ToString("yyyy-MM-dd"))]
public DateTime DateCreated { get; set; }
E espera que o valor seja uma expressão constante.
Isso ocorre no contexto do uso com Dados Dinâmicos do ASP.NET. Não quero fazer o scaffold da coluna DateCreated, mas simplesmente fornecer DateTime.Now se não estiver presente. Estou usando o Entity Framework como minha camada de dados
Felicidades,
Andrew
fonte
get
parte pode ser simplificada para:return dateCreated ?? DateTime.Now;
Adicione abaixo à propriedade DateTime
fonte
Não há motivo para eu sugerir que não seja possível fazer por meio de um atributo. Pode estar no backlog da Microsoft. Quem sabe.
A melhor solução que encontrei é usar o parâmetro defaultValueSql na primeira migração do código.
Eu não gosto da solução de referência frequente de configurá-lo no construtor de classe de entidade porque se qualquer coisa diferente do Entity Framework colocar um registro nessa tabela, o campo de data não obterá um valor padrão. E a ideia de usar um gatilho para lidar com esse caso parece errada para mim.
fonte
Eu testei isso no EF core 2.1
Aqui você não pode usar convenções ou anotações de dados. Você deve usar a API Fluent .
Doc oficial
fonte
É possível e bastante simples:
para
DateTime.MinValue
para qualquer outro valor como último argumento de
DefaultValueAttribute
especificar string que representa o valor DateTime desejado.Este valor deve ser uma expressão constante e é necessário para criar o objeto (
DateTime
) usandoTypeConverter
.fonte
defaultValue: new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified)
Uma solução simples se você estiver usando o Entity Framework é adicionar uma classe particular e definir um construtor para a entidade, já que o framework não define um. Por exemplo, se você tiver uma entidade chamada Exemplo, você colocará o código a seguir em um arquivo separado.
fonte
Acho que a solução mais fácil é definir
na declaração de coluna e no VS2010 EntityModel designer definir propriedade de coluna correspondente StoreGeneratedPattern = Computed .
fonte
Criar uma nova classe de atributo é uma boa sugestão. No meu caso, eu queria especificar 'default (DateTime)' ou 'DateTime.MinValue' para que o serializador Newtonsoft.Json ignorasse os membros DateTime sem valores reais.
Sem o atributo DefaultValue, o serializador JSON produziria "1/1/0001 12:00:00 AM", embora a opção DefaultValueHandling.Ignore fosse definida.
fonte
Simplesmente considere definir seu valor no construtor de sua classe de entidade
fonte
Datetime
propriedade nullable antes de fazer isso.Eu precisava de um carimbo de data / hora UTC como um valor padrão e, portanto, modifiquei a solução de Daniel assim:
Para o tutorial DateRangeAttribute, veja esta postagem de blog incrível
fonte
using System.ComponentModel.DataAnnotations.Schema;
fonte
Há uma maneira. Adicione essas classes:
DefaultDateTimeValueAttribute.cs
DefaultDateTimeExtensions.cs
E use DefaultDateTimeValue como um atributo para suas propriedades. Os valores a serem inseridos em seu atributo de validação são coisas como "Agora", que serão renderizados em tempo de execução a partir de uma instância DateTime criada com um ativador. O código-fonte é inspirado neste tópico: https://code.msdn.microsoft.com/A-flexible-Default-Value-11c2db19 . Eu mudei para fazer minha classe herdar com DefaultValueAttribute em vez de um ValidationAttribute.
fonte
Eu enfrentei o mesmo problema, mas o que funciona melhor para mim está abaixo:
fonte
Acabei de encontrar isso procurando por algo diferente, mas na nova versão C #, você pode usar uma versão ainda mais curta para isso:
fonte
fonte
Como você lida com isso no momento depende de qual modelo você está usando Linq to SQL ou EntityFramework?
No L2S você pode adicionar
EF é um pouco mais complicado, consulte http://msdn.microsoft.com/en-us/library/cc716714.aspx para obter mais informações sobre a lógica de negócios da EF.
fonte
Sei que este post é um pouco antigo, mas tenho uma sugestão que pode ajudar um pouco.
Usei um Enum para determinar o que definir no construtor de atributo.
Declaração de propriedade:
Construtor de propriedade:
Enum:
fonte
Acho que você pode fazer isso usando
StoreGeneratedPattern = Identity
(definido na janela de propriedades do designer de modelo).Eu não teria imaginado que seria assim, mas ao tentar descobrir, percebi que algumas das minhas colunas de data já estavam padronizadas
CURRENT_TIMESTAMP()
e outras não. Verificando o modelo, vejo que a única diferença entre as duas colunas além do nome é que aquela que obtém o valor padrão foiStoreGeneratedPattern
definida comoIdentity
.Eu não esperava que fosse esse o caminho, mas lendo a descrição, meio que faz sentido:
Além disso, embora isso faça com que a coluna do banco de dados tenha um valor padrão de "agora", acho que na verdade não define a propriedade como
DateTime.Now
no POCO. Isso não tem sido um problema para mim, pois tenho um arquivo .tt personalizado que já define todas as minhas colunas de data paraDateTime.Now
automaticamente (na verdade não é difícil modificar o arquivo .tt por conta própria, especialmente se você tiver ReSharper e obter um destaque de sintaxe plugin. (As versões mais recentes do VS podem já destacar a sintaxe dos arquivos .tt, não tenho certeza.))O problema para mim era: como faço para que a coluna do banco de dados tenha um padrão para que as consultas existentes que omitem essa coluna ainda funcionem? E a configuração acima funcionou para isso.
Ainda não testei, mas também é possível que a configuração interfira na configuração de seu próprio valor explícito. (Eu só tropecei nisso em primeiro lugar porque o EF6 Database First escreveu o modelo para mim dessa forma.)
fonte
No C # versão 6, é possível fornecer um valor padrão
fonte
Com EF 7:
script de migração:
resultado:
fonte
Eu também queria isso e encontrei esta solução (estou usando apenas a parte da data - um horário padrão não faz sentido como um padrão PropertyGrid):
Isso apenas cria um novo atributo que você pode adicionar à sua propriedade DateTime. Por exemplo, se o padrão for DateTime.Now.Date:
fonte