c# - tutorial - entity framework ventajas y desventajas
EF 6.1 Índice único anulable (1)
No encontré la manera de decirle a EF que use esta cláusula where, pero aquí hay alguna solución. Compruebe si encaja en su caso.
- Instale Entity Framework, defina su DbContext, entidades, conn string en app.config, etc.
- Habilitar migración: ejecute en Package Manager Console ''-EnableMigration''
- Crear DbMigration: ejecutar en la consola del gestor de paquetes ''Add-Migration MigrationName''
- En la clase DbMigration creada en el método ovverided
Up
, ejecute su sql para crear un índice nulo único.
código:
// Add unique nullable index
string indexName = "IX_UQ_UniqueColumn";
string tableName = "dbo.ExampleClasses";
string columnName = "UniqueColumn";
Sql(string.Format(@"
CREATE UNIQUE NONCLUSTERED INDEX {0}
ON {1}({2})
WHERE {2} IS NOT NULL;",
indexName, tableName, columnName));
Nota: no olvide crear una versión anterior, también. Método de Ovveride Down
y uso del método DropIndex
interior:
DropIndex(tableName, indexName);
También es posible que necesite un código adicional si ya hay datos en su base de datos que pueden entrar en conflicto con la restricción de índice único.
NOTA: Aquí puede usar el método CreateIndex, pero no pude crear el índice correcto con él. EF simplemente ignora mis AnónimosArgumentos o los escribo mal. Puede intentarlo usted mismo y escribir aquí con su resultado. La sintaxis es la siguiente:
CreateIndex(
table: "dbo.ExampleClasses",
columns: new string[] { "UniqueColumn" },
unique: true,
name: "IX_UniqueColumn",
clustered: false,
anonymousArguments: new
{
Include = new string[] { "UniqueColumn" },
Where = "UniqueColumn IS NOT NULL"
});
5 Intente agregar dos etries con valores nulos para la columna única y otros valores iguales.
Aquí está mi código de demostración - Pastebin
En EF 6.1 utilizando Code First, puede crear índices utilizando atributos en sus entidades o usar la API fluida a lo largo de las líneas de:
Property(x => x.PropertyName)
.IsOptional()
.HasMaxLength(450)
.HasColumnAnnotation("Index",
new IndexAnnotation(new IndexAttribute("IX_IndexName") {IsUnique = true, }));
¿Hay alguna manera de decir andamio WHERE PropertyName IS NOT NULL
de la misma manera que lo haría en SQL Server de forma nativa (ver: https://stackoverflow.com/a/767702/52026 )?