Estoy tratando de construir una entidad EF con Code First y una EntityTypeConfigurationAPI con fluidez. crear claves primarias es fácil, pero no es así con una restricción única. Estaba viendo publicaciones antiguas que sugerían la ejecución de comandos SQL nativos para esto, pero eso parece frustrar el propósito. ¿Es esto posible con EF6?
Aquí hay un ejemplo más realista. Agrega un índice único en múltiples propiedades: User.FirstNamey User.LastName, con un nombre de índice "IX_FirstNameLastName"
¡Esto es necesario para nombrar la anotación de columna como "Índice"! ¡Escribí otro nombre y no funcionó! Pasé horas antes de intentar cambiarle el nombre al "Índice" original como en tu publicación y entendí que esto es importante. :( Debe haber una constante para que en el marco no codifique la cadena.
Alexander Vasilyev
10
@AlexanderVasilyev La constante se define comoIndexAnnotation.AnnotationName
Nathan
3
@Nathan ¡Gracias! ¡Eso es! El ejemplo en esta publicación debe corregirse usando esta constante.
Alexander Vasilyev
2
Parece que no puedo encontrarlo en EF7 - DNX
Shimmy Weitzhandler
2
Creo que IsUnique debe establecerse en verdadero al crear IndexAttribute en el primer ejemplo. De esta manera: new IndexAttribute() { IsUnique = true }. De lo contrario, crea un índice regular (no exclusivo).
jakubka
134
Como una adición a la respuesta de Yorro, también se puede hacer mediante el uso de atributos.
Muestra para el inttipo de combinación de teclas única:
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;}}}
No, si desea mantener su modelo de dominio completamente separado de las preocupaciones de almacenamiento.
Rickard Liljeberg
44
También debe asegurarse de tener una referencia a EntityFramework
Michael Tranchida
2
Sea amable si el atributo Index se separó de Entity Framework para poder incluirlo en mi proyecto de Modelos. Entiendo que es un problema de almacenamiento, pero la razón principal por la que lo uso es para imponer restricciones únicas en cosas como UserNames y Role Names.
Sam
2
Parece que no puedo encontrarlo en EF7 - DNX
Shimmy Weitzhandler
44
Esto solo funciona si también restringe la longitud de la cadena, ya que SQL no permite que nvarchar (max) se use como clave.
JMK
17
Aquí hay un método de extensión para establecer índices únicos con mayor fluidez:
La respuesta de @ coni2k es correcta, sin embargo, debe agregar un [StringLength]atributo para que funcione; de lo contrario, obtendrá una excepción de clave no válida (Ejemplo a continuación).
IndexAnnotation.AnnotationName
new IndexAttribute() { IsUnique = true }
. De lo contrario, crea un índice regular (no exclusivo).Como una adición a la respuesta de Yorro, también se puede hacer mediante el uso de atributos.
Muestra para el
int
tipo de combinación de teclas única:Si el tipo de datos es
string
, entonces seMaxLength
debe agregar el atributo:Si existe un problema de separación de modelo de dominio / almacenamiento, el uso de
Metadatatype
atributo / clase puede ser una opción: https://msdn.microsoft.com/en-us/library/ff664465%28v=pandp.50%29.aspx?f= 255 & MSPPError = -2147217396Un ejemplo rápido de la aplicación de consola:
fuente
Aquí hay un método de extensión para establecer índices únicos con mayor fluidez:
Uso:
Generará migración como:
Src: Creación de un índice único con API fluida de Entity Framework 6.1
fuente
La respuesta de @ coni2k es correcta, sin embargo, debe agregar un
[StringLength]
atributo para que funcione; de lo contrario, obtendrá una excepción de clave no válida (Ejemplo a continuación).fuente
Lamentablemente, esto no es compatible con Entity Framework. Estaba en la hoja de ruta para EF 6, pero se retrasó: Workitem 299: Restricciones únicas (índices únicos)
fuente
fuente