Estou usando o código do Entity Framework 5.0 primeiro;
public class Entity
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public string EntityId { get; set;}
public int FirstColumn { get; set;}
public int SecondColumn { get; set;}
}
Eu quero fazer a combinação entre FirstColumn
e SecondColumn
como única.
Exemplo:
Id FirstColumn SecondColumn
1 1 1 = OK
2 2 1 = OK
3 3 3 = OK
5 3 1 = THIS OK
4 3 3 = GRRRRR! HERE ERROR
Existe alguma maneira de fazer isso?
entity-framework
ef-code-first
constraints
multiple-columns
unique-key
Bassam Alugili
fonte
fonte
Encontrei três maneiras de resolver o problema.
Índices exclusivos no EntityFramework Core:
Primeira abordagem:
A segunda abordagem para criar restrições exclusivas com o EF Core usando chaves alternativas.
Exemplos
Uma coluna:
Várias colunas:
EF 6 e abaixo:
Primeira abordagem:
Essa abordagem é muito rápida e útil, mas o principal problema é que o Entity Framework não sabe nada sobre essas alterações!
Segunda abordagem:
Encontrei-a neste post, mas não tentei sozinha.
O problema dessa abordagem é o seguinte: Ele precisa do DbMigration, então o que você faz se não o possui?
Terceira abordagem:
acho que é a melhor, mas requer algum tempo para fazê-lo. Vou apenas mostrar a idéia por trás disso: neste link http://code.msdn.microsoft.com/CSASPNETUniqueConstraintInE-d357224a, você pode encontrar o código para anotação de dados chave exclusiva:
O problema para esta abordagem; Como posso combiná-los? Eu tenho uma idéia para estender esta implementação da Microsoft, por exemplo:
Posteriormente, no IDatabaseInitializer, conforme descrito no exemplo da Microsoft, você pode combinar as chaves de acordo com o número inteiro especificado. Porém, uma coisa deve ser observada: se a propriedade exclusiva for do tipo string, você deverá definir o MaxLength.
fonte
CREATE UNIQUE INDEX ix_{1}_{2} ON {0} ({1}, {2})
:? (ver BOL )Se você estiver usando o Code-First , poderá implementar uma extensão personalizada HasUniqueIndexAnnotation
Em seguida, use-o assim:
O que resultará nessa migração:
E, eventualmente, acabam no banco de dados como:
fonte
this.Property(t => t.Email)
), o que é que contém classe? (isto é: o que éthis
)EntityTypeConfiguration<T>
Você precisa definir uma chave composta.
Com anotações de dados, fica assim:
Você também pode fazer isso com o modelBuilder ao substituir OnModelCreating especificando:
fonte
A resposta de niaher afirmando que, para usar a API fluente, você precisa de uma extensão personalizada pode estar correta no momento da redação. Agora você pode (EF core 2.1) usar a API fluente da seguinte maneira:
fonte
Concluindo a resposta @chuck para usar índices compostos com chaves estrangeiras .
Você precisa definir uma propriedade que reterá o valor da chave estrangeira. Você pode usar essa propriedade dentro da definição de índice.
Por exemplo, temos empresa com funcionários e somente temos uma restrição exclusiva (nome, empresa) para qualquer funcionário:
Agora o mapeamento da classe Employee:
Observe que eu também usei a extensão @niaher para anotação de índice exclusivo.
fonte
Na resposta aceita por @chuck, há um comentário dizendo que não funcionará no caso do FK.
funcionou para mim, caso do EF6 .Net4.7.2
fonte
Suponho que você sempre queira
EntityId
ser a chave primária, portanto, substituí-la por uma chave composta não é uma opção (apenas porque as chaves compostas são muito mais complicadas de se trabalhar e porque não é muito sensato ter chaves primárias que também tenham significado na lógica de negócios).O mínimo que você deve fazer é criar uma chave exclusiva nos dois campos do banco de dados e verificar especificamente se há exceções de violação de chave exclusivas ao salvar as alterações.
Além disso, você pode (deve) verificar valores exclusivos antes de salvar as alterações. A melhor maneira de fazer isso é através de uma
Any()
consulta, porque minimiza a quantidade de dados transferidos:Cuidado que esse cheque sozinho nunca é suficiente. Sempre há alguma latência entre a verificação e a confirmação real, portanto, você sempre precisará da restrição exclusiva + tratamento de exceções.
fonte
Recentemente, adicionamos uma chave composta com a exclusividade de 2 colunas usando a abordagem recomendada pelo 'chuck', obrigado @chuck. Só isso abordado me pareceu mais limpo:
fonte