Estou tentando criar uma entidade EF com o Code First e uma EntityTypeConfigurationAPI fluente usando. criar chaves primárias é fácil, mas não é assim com uma restrição exclusiva. Eu estava vendo postagens antigas que sugeriam a execução de comandos SQL nativos para isso, mas que parecem anular o objetivo. isso é possível com o EF6?
Aqui está um exemplo mais realista. Ele adiciona um índice exclusivo em várias propriedades: User.FirstNamee User.LastName, com um nome de índice "IX_FirstNameLastName"
Isso é necessário para nomear a anotação da coluna como "Índice"! Eu escrevi outro nome e não funcionou! Passei horas antes de tentar renomeá-lo para "Índice" original, como na sua postagem, e entendi que isso é importante. :( Deve haver uma constante no framework para não codificar a string com
firmeza
10
@AlexanderVasilyev A constante é definida como #IndexAnnotation.AnnotationName
Nathan
3
@ Nathan Obrigado! É isso aí! O exemplo nesta postagem deve ser corrigido usando essa constante.
Alexander Vasilyev
2
Não consigo encontrá-lo no EF7 - DNX
Shimmy Weitzhandler
2
Acredito que IsUnique precisa ser definido como true ao criar IndexAttribute no primeiro exemplo. Como esta: new IndexAttribute() { IsUnique = true }. Caso contrário, ele cria apenas um índice regular (não exclusivo).
jakubka
134
Como complemento à resposta de Yorro, isso também pode ser feito usando atributos.
Amostra para intcombinação de teclas exclusiva do tipo:
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity;
namespace EFIndexTest{classProgram{staticvoidMain(string[] args){
using (var context =newAppDbContext()){var newUser =newUser{UniqueKeyIntPart1=1,UniqueKeyIntPart2=1,UniqueKeyStringPart1="A",UniqueKeyStringPart2="A"};
context.UserSet.Add(newUser);
context.SaveChanges();}}}[MetadataType(typeof(UserMetadata))]publicclassUser{publicintId{get;set;}publicintUniqueKeyIntPart1{get;set;}publicintUniqueKeyIntPart2{get;set;}publicstringUniqueKeyStringPart1{get;set;}publicstringUniqueKeyStringPart2{get;set;}}publicclassUserMetadata{[Index("IX_UniqueKeyInt",IsUnique=true,Order=1)]publicintUniqueKeyIntPart1{get;set;}[Index("IX_UniqueKeyInt",IsUnique=true,Order=2)]publicintUniqueKeyIntPart2{get;set;}[Index("IX_UniqueKeyString",IsUnique=true,Order=1)][MaxLength(50)]publicstringUniqueKeyStringPart1{get;set;}[Index("IX_UniqueKeyString",IsUnique=true,Order=2)][MaxLength(50)]publicstringUniqueKeyStringPart2{get;set;}}publicclassAppDbContext:DbContext{publicvirtualDbSet<User>UserSet{get;set;}}}
Não, se você deseja manter seu modelo de domínio completamente separado das preocupações de armazenamento.
Rickard Liljeberg 26/10
4
Você também precisa ter certeza de que você tem uma referência a EntityFramework
Michael Tranchida
2
Seja legal se o atributo Index foi separado do Entity Framework para que eu pudesse incluí-lo no meu projeto Models. Entendo que é um problema de armazenamento, mas o principal motivo para usá-lo é colocar restrições exclusivas em itens como UserNames e Role Names.
Sam
2
Não consigo encontrá-lo no EF7 - DNX
Shimmy Weitzhandler
4
Isso funciona apenas se você também restringir o comprimento da cadeia, pois o SQL não permite que o nvarchar (max) seja usado como chave.
JMK
17
Aqui está um método de extensão para definir índices exclusivos com mais fluência:
A resposta de @ coni2k está correta, no entanto, você deve adicionar um [StringLength]atributo para que ele funcione, caso contrário, você receberá uma exceção de chave inválida (exemplo a seguir).
IndexAnnotation.AnnotationName
new IndexAttribute() { IsUnique = true }
. Caso contrário, ele cria apenas um índice regular (não exclusivo).Como complemento à resposta de Yorro, isso também pode ser feito usando atributos.
Amostra para
int
combinação de teclas exclusiva do tipo:Se o tipo de dados for
string
, oMaxLength
atributo deverá ser adicionado:Se houver uma preocupação de separação de modelo de domínio / armazenamento, o uso de
Metadatatype
atributo / classe pode ser uma opção: https://msdn.microsoft.com/en-us/library/ff664465%28v=pandp.50%29.aspx?f= 255 & MSPPError = -2147217396Um exemplo rápido de aplicativo de console:
fonte
Aqui está um método de extensão para definir índices exclusivos com mais fluência:
Uso:
Irá gerar migração como:
Src: Criando índice exclusivo com API fluente do Entity Framework 6.1
fonte
A resposta de @ coni2k está correta, no entanto, você deve adicionar um
[StringLength]
atributo para que ele funcione, caso contrário, você receberá uma exceção de chave inválida (exemplo a seguir).fonte
Infelizmente, isso não é suportado no Entity Framework. Estava no roteiro do EF 6, mas foi adiado: Workitem 299: Restrições Exclusivas (Índices Exclusivos)
fonte
fonte