2014-05-14 5 views
16

Inizialmente ho utilizzato il codice EF 6 per creare un nuovo database e due nuove tabelle. Il codice è:Come aggiungere una nuova tabella al codice del database esistente prima

public class TestingContext : DbContext, IDisposable 
{ 
    public DbSet<CallDataRecord> CallDataRecords { get; set; } 
    public DbSet<Attempt> Attempts { get; set; } 

    public TestingContext() 
     : base("Testing") 
    { 
     Database.SetInitializer<TestingContext>(new MigrateDatabaseToLatestVersion<TestingContext, GenericIVR.Migrations.Configuration>()); 
    } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Attempt>().HasRequired(t => t.CallDataRecord).WithMany(a => a.Attempts).HasForeignKey(t => t.FKTaskId); 

     modelBuilder.Entity<Attempt>().Property(x => x.AttemptId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity).IsRequired(); 

     modelBuilder.Entity<CallDataRecord>().Property(x => x.TaskId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity).IsRequired(); 
    } 
} 

Ora la mia strategia è cambiata, non voglio un nuovo DB. Voglio aggiungere le nuove tabelle a un DB esistente, ad esempio DevDB.

Come modificare il codice? Devo usare Reverse Engineering Code First?

aggiornamento: La stringa di connessione è:

<connectionStrings> 
<add name="Testing" connectionString="Data Source=dddd.corporate.xxxx.com; Initial Catalog=Testing; User ID=sa; Password=password; MultipleActiveResultSets=True" providerName="System.Data.SqlClient" /> 

risposta

17

Se avete migrazioni automatiche impostare questa dovrebbe essere abbastanza semplice

Se non lo avete, è necessario eseguire Enable-Migrations –EnableAutomaticMigrations Forse fare un po 'la lettura di questo qui prima però: http://msdn.microsoft.com/en-gb/data/jj554735.aspx

per chi cerca di aggiornare un database con una nuova tabella (ad esempio voglio aggiungere un UserAttachment tavolo per sedersi al fianco di mio tavolo utente esistente) utilizzando il codice EF prima, procedere come segue:

Con le migrazioni automatico abilitato si dovrebbe assicurare di avere ...

1.) Crea il tuo nuovo modello, come si vede in forma.

2.) Creare il file di configurazione, qualcosa sulla falsariga di:

class UserAttachmentConfiguration : EntityTypeConfiguration<UserAttachment> 
    { 
     public UserAttachmentConfiguration() 
      : base() 
     { 
      HasKey(p => p.UserId); 
      ToTable("UserAttachment");  

      HasRequired(t => t.User) 
       .WithOptional(t => t.UserAttachment);     
     } 
    } 

3.) Aggiungi la tua DbSet e modelBuilder dati nel file principale Context.cs

DbSet

public DbSet<UserAttachment> UserAttachment {get; set;} 

modelBuilder

modelBuilder.Configurations.Add(new UserAttachmentConfiguration()); 

4.) Eseguire update-database tramite Visual Studio Package Manager Console, assicurarsi di aver selezionato il progetto corretto dal menu a discesa, è probabile che sia un progetto denominato .Repository.

Il nuovo tavolo deve ora esistente nel database.

+5

Per chiunque tenti di modificare questo post per includere il passaggio Add-Migration prima del comando Update-Database, si noti che ho risposto a questa presunta che le migrazioni automatiche siano abilitate, quindi perché non sto provando a impalcare manualmente questa modifica. Scorri verso il basso fino a "La tua prima migrazione automatica" http://blogs.msdn.com/b/adonet/archive/2012/02/09/ef-4-3-automatic-migrations-walkthrough.aspx – JsonStatham

0

Ti hanno migrazioni impostare? Se è così, basta migrare il database (aggiungi-migrazione blah; update-database) e aggiungerà solo la nuova tabella.

Se non sono state abilitate le migrazioni, è necessario continuare con il codice sopra riportato. Dovrebbe solo aggiungere la tabella durante la migrazione.

Sto digitando questo dal mio telefono o vorrei fornire un test di codice.

+0

Devo modificare TestingContext uno nuovo nel codice? E per quanto riguarda la stringa di connessione? –

+0

Fintanto che hai ancora la configurazione delle migrazioni automatiche, aggiungerai semplicemente la tabella per te. Può essere un po 'complicato se si cambiano i tipi di colonne in un database già esistente, ma se si sta solo aggiungendo una tabella come sopra, dbSet farà semplicemente inviare i comandi per ottenere lo schema come modello di contesto. – MarkWalls

+0

Immagino che manchi il mio punto. Si prega di consultare la mia stringa di connessione aggiornata. Inizialmente ho creato un DB 'Initial Catalog = Testing ', ora voglio aggiungere le tabelle al DB esistente' DevDB'. Penso di dover cambiare la stringa di connessione, magari anche il codice. –

21

Basta creare la nuova tabella come modello e aggiungere la sua entrata in classe DbContext

qualcosa come

public class TestingContext : DbContext, IDisposable 
{ 
    public DbSet<CallDataRecord> CallDataRecords { get; set; } 
    public DbSet<Attempt> Attempts { get; set; } 

    public DbSet<MyNewModel> MyNewModels { get; set; } 

Poi add-migrations e update-database

+5

Nel caso in cui aiuti qualcun altro, menzionerò il mio facepalm. Assicurati di utilizzare una proprietà, non un campo. Funzionerà solo con '{get; set;} ' – Thomas

+0

Ahah! La proprietà contro campo mi ha preso. Grazie @ Thomas! – N1njaB0b

+0

È sufficiente creare una nuova classe nella cartella Modello e quindi aggiungere quella riga 'public DbSet MyNewModels {get; impostato; } '? Perché ho provato ma non ha funzionato. Ha dato errore: il progetto '' non è riuscito a costruire. Perché mi succede questo? – Nurul

0
  1. Enable-Migrations dalla console del gestore pacchetti.

  2. creare configurazioni di classe come

    namespace Demo.Data.Configurations 
    { 
        public class DemoConnectionConfiguration : EntityTypeConfiguration<DemoConnection> 
        { 
         public DemoConnectionConfiguration() 
         { 
          ToTable("DemoConnection"); 
          HasKey(a => a.Id); 
         } 
        } 
    } 
    
  3. Aggiungere Dbset e Model Builder in Context.cs come

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
        modelBuilder.Configurations.Add(new DemoConnectionConfiguration()); 
    
        base.OnModelCreating(modelBuilder); 
    } 
    
    
    public DbSet<DemoConnection> DemoConnection { get; set; } 
    
  4. "Update-database" dal Console Package Manager.

Nota: "Si prega di selezionare la cartella direttamente dal progetto predefinito Elenco a discesa"

Complimenti! La tua tabella DemoConnection è ora in Database.

+0

Ciao, sembra che tu avere due account (https://stackoverflow.com/users/5772608/chetan-pandey e https://stackoverflow.com/users/6782677/chetan-pandey). Se lo desideri, puoi unire i due account seguendo i passaggi su https://stackoverflow.com/help/merging-accounts – Matt