Sto utilizzando Entity Framework 6 code-first con un database esistente, ma avendo problemi a mappare le mie entità alle tabelle del database.
Normalmente, userei l'approccio database-first e ho la mia entità e il codice di contesto generati, ma usare il designer è diventato un enorme dolore.
Ho impostato Database.SetInitializer (null) perché non voglio che EF cambi il mio schema.
Schema del database:
Codice-prima:
public class Project
{
public int ProjectId { get; set; }
public string Name { get; set; }
public string Description { get; set; }
}
public class ReleaseControlContext : DbContext
{
public ReleaseControlContext()
: base(ConfigurationManager.ConnectionStrings["ReleaseControl"].ConnectionString)
{
Database.SetInitializer<ReleaseControlContext>(null);
}
public DbSet<Project> Projects { get; set; }
}
Chiamare il codice:
using(var context = new ReleaseControlContext())
{
var projects = context.Projects.ToList();
}
Viene generata la seguente eccezione:
SqlException: nome oggetto non valido 'dbo.Projects'.
Questo perché la mia tabella di database è Project e non Projects . Non voglio rinominare il mio contesto DbSet<Project>
in "Progetto" perché sarebbe semanticamente scorretto.
Domanda:
Devo utilizzare le annotazioni DbSet<Project> Projects
API / dati per eseguire il mapping tra la tabella del database del progetto e la DbSet<Project> Projects
?
Puoi usare il
[Table("Project")]
public class Project {
....
}
annotazione contro l'entità di progetto, o nel OnModelCreating(DbModelBuilder modelBuilder)
è possibile chiamare modelBuilder.Entity<Project>().ToTable("Project");
.
Entrambi farebbero la stessa cosa
Dovresti definire una classe (es: ProjectMap
) che eredita dalla classe generica EntityTypeConfiguration(T)
dove T
è qui la tua classe Project
. In questa classe ProjectMap
, puoi definire esplicitamente una mappatura di tabelle:
this.ToTable("Project", "dbo");
La classe ProjectMap
deve essere chiamata nel seguente metodo della classe DbContext
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new ProjectMap());
}