existe uma maneira "elegante" de atribuir um valor padrão a uma propriedade específica?
Talvez por DataAnnotations, algo como:
[DefaultValue("true")]
public bool Active { get; set; }
Obrigado.
entity-framework
ef-code-first
default-value
marino-krk
fonte
fonte
this.Active = true;
? Eu acho que o valor do banco de dados terá precedência ao buscar, mas tome cuidado se for necessário anexar uma entidade para uma atualização sem uma busca primeiro, pois o rastreamento de alterações pode ver isso como você deseja atualizar o valor. Comente porque não uso a EF há muito tempo e sinto que isso é um tiro no escuro.public bool Inactive { get; set; }
JRespostas:
Você pode fazer isso editando manualmente a primeira migração do código:
fonte
Active
aotrue
criar umEvent
objeto. O valor padrão sempre estáfalse
em uma propriedade bool não anulável; portanto, a menos que seja alterado, é isso que a estrutura da entidade salvará no banco de dados. Ou eu estou esquecendo de alguma coisa?Já faz um tempo, mas deixando um recado para os outros. Consegui o que é necessário com um atributo e decorei meus campos de classe de modelo com esse atributo, conforme desejado.
Obtenha a ajuda destes 2 artigos:
O que eu fiz:
Definir atributo
No "OnModelCreating" do contexto
No SqlGenerator personalizado
Em seguida, no construtor Migration Configuration, registre o gerador SQL personalizado.
fonte
[SqlDefaultValue(DefaultValue = "getutcdate()")]
todas as entidades. 1) Simplesmente removamodelBuilder.Conventions.Add( new AttributeToColumnAnnotationConvention<SqlDefaultValueAttribute, string>("SqlDefaultValue", (p, attributes) => attributes.Single().DefaultValue));
2) AddmodelBuilder.Properties().Where(x => x.PropertyType == typeof(DateTime)).Configure(c => c.HasColumnType("datetime2").HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed).HasColumnAnnotation("SqlDefaultValue", "getdate()"));
As respostas acima realmente ajudaram, mas apenas forneceram parte da solução. O principal problema é que, assim que você remover o atributo Valor padrão, a restrição na coluna no banco de dados não será removida. Portanto, o valor padrão anterior ainda permanecerá no banco de dados.
Aqui está uma solução completa para o problema, incluindo a remoção de restrições SQL na remoção de atributos. Também estou reutilizando o
DefaultValue
atributo nativo do .NET Framework .Uso
Para que isso funcione, é necessário atualizar os arquivos IdentityModels.cs e Configuration.cs
Arquivo IdentityModels.cs
Adicione / atualize este método em sua
ApplicationDbContext
classeArquivo Configuration.cs
Atualize seu
Configuration
construtor de classe registrando o gerador Sql personalizado, desta forma:Em seguida, adicione a classe de gerador Sql personalizada (você pode adicioná-lo ao arquivo Configuration.cs ou a um arquivo separado)
fonte
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
atributo? Se sim, por quê? Nos meus testes, parecia não ter efeito deixar de fora.As propriedades do seu modelo não precisam ser 'propriedades automáticas', embora isso seja mais fácil. E o atributo DefaultValue é realmente apenas metadados informativos. A resposta aceita aqui é uma alternativa à abordagem do construtor.
vs.
Isso funcionará apenas para aplicativos que criam e consomem dados usando essa classe específica. Normalmente, isso não é um problema se o código de acesso a dados estiver centralizado. Para atualizar o valor em todos os aplicativos, você precisa configurar a fonte de dados para definir um valor padrão. A resposta da Devi mostra como isso pode ser feito usando migrações, sql ou qualquer idioma que sua fonte de dados fale.
fonte
O que eu fiz, eu inicializei valores no construtor da entidade
Nota: Os atributos DefaultValue não definirão os valores de suas propriedades automaticamente, você deve fazer isso sozinho
fonte
Após o comentário do @SedatKapanoglu, estou adicionando toda a minha abordagem que funciona, porque ele estava certo, apenas o uso da API fluente não funciona.
1- Crie um gerador de código personalizado e substitua Gerar para um ColumnModel.
2- Atribua o novo gerador de código:
3- Use API fluente para criar a anotação:
fonte
É simples! Apenas anote com o necessário.
a migração resultante será:
Se você quiser true, altere o defaultValue para true na migração antes de atualizar o banco de dados
fonte
true
?Admito que minha abordagem escapa a todo o conceito "Code First". Mas se você tem a capacidade de alterar apenas o valor padrão na própria tabela ... é muito mais simples do que os comprimentos que você precisa passar acima ... Estou com preguiça de fazer todo esse trabalho!
Quase parece que a ideia original dos pôsteres funcionaria:
Eu pensei que eles apenas cometeram o erro de adicionar aspas ... mas, infelizmente, não existe essa intuição. As outras sugestões foram demais para mim (desde que eu tenha os privilégios necessários para entrar na mesa e fazer as alterações ... onde nem todos os desenvolvedores estarão em todas as situações). No final, eu fiz da maneira antiga. Defino o valor padrão na tabela do SQL Server ... quero dizer, já chega! NOTA: Além disso, testei a adição de um banco de dados de migração e atualização e as alterações travadas.
fonte
Apenas sobrecarregue o construtor padrão da classe Model e passe qualquer parâmetro relevante que você possa ou não usar. Com isso, você pode facilmente fornecer valores padrão para atributos. Abaixo está um exemplo.
fonte
Vamos considerar que você tem um nome de classe chamado Produtos e um campo IsActive. você só precisa de um construtor create:
Em seguida, seu valor padrão IsActive é True!
Edite :
se você quiser fazer isso com o SQL, use este comando:
fonte
No núcleo da EF lançado em 27 de junho de 2016, você pode usar a API fluente para definir o valor padrão. Vá para a classe ApplicationDbContext, encontre / crie o nome do método OnModelCreating e adicione a seguinte API fluente.
fonte
No .NET Core 3.1, você pode fazer o seguinte na classe de modelo:
No DbContext OnModelCreating, você adiciona o valor padrão.
Resultando no seguinte no banco de dados
Nota: Se você não tiver nulo (bool?) Para sua propriedade, receberá o seguinte aviso
fonte
Descobri que apenas o uso do Inicializador automático de propriedades na propriedade da entidade é suficiente para realizar o trabalho.
Por exemplo:
fonte
Hmm ... eu faço DB primeiro, e nesse caso, isso é realmente muito mais fácil. EF6 certo? Basta abrir o modelo, clicar com o botão direito do mouse na coluna para a qual você deseja definir um padrão, escolher propriedades e você verá um campo "DefaultValue". Basta preencher e salvar. Ele irá configurar o código para você.
Sua milhagem pode variar primeiro no código, mas não trabalhei com isso.
O problema com muitas outras soluções é que, embora possam funcionar inicialmente, assim que você reconstruir o modelo, ele lançará qualquer código personalizado inserido no arquivo gerado pela máquina.
Este método funciona adicionando uma propriedade extra ao arquivo edmx:
E adicionando o código necessário ao construtor:
fonte
Defina o valor padrão para a coluna na tabela no MSSQL Server e, no código da classe, adicione o atributo, assim:
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
para a mesma propriedade.
fonte