comandos - Restricción única con Entity Framework usando las migraciones de Code First
migraciones entity framework (3)
Con las primeras migraciones de código, acabo de usar esto en el método Up()
para agregar un índice único en una sola columna:
CreateIndex(table: "Organisations",
column: "Name",
unique: true, // unique index
name: "MyIndex");
... y luego en el método Down()
:
DropIndex(table: "Organisations",
name: "MyIndex");
¿Es eso lo que buscas?
Estoy haciendo el primer framework de entidad (v 5) código de migraciones, en una aplicación MVC 4. Me gustaría agregar una restricción única en el nivel de la base de datos.
Sé que esto se puede hacer al crear la tabla, pero ya tengo una tabla. http://msdn.microsoft.com/en-US/data/jj591621
He intentado lo siguiente, marcado como respuesta respuesta: restricción única con EFCodeFirst y SqlCe4
El contexto de mi base de datos difiere ligeramente, yo proporciono el nombre de la conexión como sigue
public AppDatabaseContext() : base("MyConnectionDBContext")
Cuando uso la Consola de administración de paquetes para actualizar la base de datos, no se llama al método de inicialización anulado:
protected override void Seed(AppDatabaseContext context)
También he intentado lo siguiente: http://romiller.com/2010/07/31/ef-ctp4-tips-tricks-running-additional-ddl/
No utilicé una clase anidada, esto se debe a que parecía que tenía que volver a registrar el inicializador a través de la aplicación .config. No pude hacerlo funcionar mientras lo inicializaba en código. Se llama a InitializeDatabase, pero la siguiente condición nunca es verdadera:
(!context.Database.Exists() || !context.Database.ModelMatchesDatabase())
Esto se debe a que esto ocurre después de que se hayan ejecutado las migraciones ...
También intenté esto en una etapa: Restricción única en el código de Entity Framework Primero , era el mismo problema que antes, esta condición nunca se volvió verdadera.
Idealmente, me gustaría incluir algún SQL estándar en mi archivo de migración. ¿Hay una manera de hacerlo? Si no, ¿dónde puedo ver cómo lograr esto con el uso de las primeras migraciones de código?
¡Gracias!
ACTUALIZAR:
¿Hay alguna razón por la que no pueda usar la función SQL?
public override void Up()
{
AddColumn("Posts", "Abstract", c => c.String());
Sql("UPDATE Posts SET Abstract = LEFT(Content, 100) WHERE Abstract IS NULL");
}
Obviamente usando el SQL correcto ...
Desde EF 6.1, ahora puede hacer esto en su modelo con cualquiera
un atributo
[Index("IX_UniqueName", IsUnique = true)]
public string Name {get;set;}
o fluido
Property(s => s.Name).HasColumnAnnotation(IndexAnnotation.AnnotationName,
new IndexAnnotation(
new IndexAttribute("IX_UniqueName") { IsUnique = true }));
El método fluido no es perfecto como su OMI verbalmente loco, pero al menos es posible ahora.
Más deets en el blog de Arthur Vickers http://blog.oneunicorn.com/2014/02/15/ef-6-1-creating-indexes-with-indexattribute/
Simplemente puede crear una nueva migración mediante el comando Add-Migration
desde la consola del administrador de paquetes. Una vez que se crea la migración vacía, en el método Up
, puede usar el método CreateIndex
de la clase DbMigration
para crear su nuevo índice. Se vería como algo como esto:
CreateIndex("dbo.Accounts", "AccessKey", unique: true);