Me encontré con el mismo problema no hace mucho tiempo.
Me dieron una base de datos con algunas tablas (ver a continuación).
public class ClinicDbContext : DbContext
{
public DbSet<User> Users { get; set; }
public DbSet<Doctor> Doctors { get; set; }
public DbSet<Patient> Patients { get; set; }
public DbSet<Secretary> Secretarys { get; set; }
public DbSet<Disease> Diseases { get; set; }
public DbSet<Consultation> Consultations { get; set; }
public DbSet<Administrator> Administrators { get; set; }
}
la tabla de usuarios se describe así:
public class User
{
[Key]
public Guid UserId { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
public string Name { get; set; }
public string Surname { get; set; }
public string IdentityCardNumber { get; set; }
public string PersonalNumericalCode { get; set; }
public DateTime DateOfBirth { get; set; }
public string Address { get; set; }
}
A continuación, se me pidió que asegurarse de que todos los 'Nombre de usuario' atributos sería único. Dado que no hay anotaciones para eso, tuve que resolver un problema. Y aquí está:
En primer lugar, he cambiado de clase de contexto de base de datos para tener este aspecto:
public class ClinicDbContext : DbContext
{
public DbSet<User> Users { get; set; }
public DbSet<Doctor> Doctors { get; set; }
public DbSet<Patient> Patients { get; set; }
public DbSet<Secretary> Secretarys { get; set; }
public DbSet<Disease> Diseases { get; set; }
public DbSet<Consultation> Consultations { get; set; }
public DbSet<Administrator> Administrators { get; set; }
public class Initializer : IDatabaseInitializer<ClinicDbContext>
{
public void InitializeDatabase(ClinicDbContext context)
{
if (!context.Database.Exists() || !context.Database.CompatibleWithModel(false))
{
if (context.Database.Exists())
{
context.Database.Delete();
}
context.Database.Create();
context.Database.ExecuteSqlCommand("CREATE INDEX IX_Users_UserName ON dbo.Users (UserName)");
}
}
}
}
La parte importante de lo anterior es el comando sql que altera la mesa mediante la aplicación de un único índice en nuestra columna deseada -> Nombre de usuario en nuestro caso.
Este método puede ser llamado desde la clase principal, por ejemplo:
class Program
{
static void Main(string[] args)
{
Database.SetInitializer<ClinicDbContext>(new ClinicDbContext.Initializer());
using (var ctx = new ClinicDbContext())
{
Console.WriteLine("{0} products exist in the database.", ctx.Users.Count());
}
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
}
La última cuestión, que se produjo al intentar ejecutar el Programa clase fue el siguiente: columna de la tabla es de un tipo que no es válido para usar como columna clave en un índice
Para resolver este problema, acabo de agregar un [MaxLength (250)] anotación para el atributo UserName.
Aquí es cómo la clase usuario ve en el final:
public class User
{
[Key]
public Guid UserId { get; set; }
[MaxLength(250)]
public string UserName { get; set; }
public string Password { get; set; }
public string Name { get; set; }
public string Surname { get; set; }
public string IdentityCardNumber { get; set; }
public string PersonalNumericalCode { get; set; }
public DateTime DateOfBirth { get; set; }
public string Address { get; set; }
}
espero que va a resolver su problema también!
Thx para el enlace, eso era lo que estaba buscando. –
Lamentablemente, la versión futura no será la siguiente (EF 5.0 y .NET 4.5) –