2014-05-14 11 views
16

Ursprünglich verwendete ich zuerst EF 6-Code, um eine neue Datenbank und zwei neue Tabellen zu erstellen. Der Code lautet:So fügen Sie dem vorhandenen Datenbankcode zuerst eine neue Tabelle hinzu

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(); 
    } 
} 

Jetzt ist meine Strategie geändert, ich will keine neue DB. Ich möchte die neuen Tabellen zu einer vorhandenen Datenbank hinzufügen, sagen DevDB.

Wie kann ich den Code ändern? Muss ich verwenden Reverse Engineering Code First?

AKTUALISIERT: Die Verbindungszeichenfolge ist:

<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" /> 

Antwort

17

Wenn Sie automatische Migrationen dies einrichten sollte ziemlich geradlinig sein.

Wenn Sie nicht haben, müssen Sie Enable-Migrations –EnableAutomaticMigrations Vielleicht tun einige weiter laufen zu lesen hier jedoch zuerst: http://msdn.microsoft.com/en-gb/data/jj554735.aspx

Für alle, eine Datenbank mit einer neuen Tabelle zu aktualisieren, suchen (sagen, ich will ein UserAttachment hinzufügen Tabelle neben meiner vorhandenen Benutzertabelle) mit EF-Code zuerst, gehen Sie wie folgt setzen:

Mit automatischer Migration aktivierten Sie sollen sicherstellen, Sie haben ...

1.) Legen Sie Ihr neues Modell, wie Sie für richtig halten.

2.) Erstellen Sie Ihre Konfigurationsdatei, etwas entlang der Linien von:

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

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

3.) Fügen Sie Ihre DbSet und modelBuilder Daten in der Haupt Context.cs Datei

DbSet

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

modellBuilder

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

4.) Run update-database über Visual Studio Package Manager Console, stellen Sie sicher, dass Sie das richtige Projekt aus dem Dropdown ausgewählt haben, dies ist wahrscheinlich ein .Repository namens Projekt.

Ihre neue Tabelle sollte jetzt in Ihrer Datenbank existieren.

+5

An alle, die versuchen, diesen Beitrag so zu bearbeiten, dass sie den Schritt Add-Migration vor dem Update-Datenbank-Befehl enthalten, habe ich unter der Annahme, dass automatische Migrationen aktiviert sind, geantwortet, weshalb ich nicht versuche, diese Änderung manuell zu scaften. Scrollen Sie nach unten zu "Ihre erste automatische Migration" http://blogs.msdn.com/b/adonet/archive/2012/02/09/ef-4-3-automatic-migrations-walkthrough.aspx – JsonStatham

0

Haben Sie Migrationen einrichten? Wenn dies der Fall ist, migrieren Sie einfach die Datenbank (add-migration blah; update-database) und es wird nur die neue Tabelle hinzugefügt.

Wenn Sie keine Migrationen aktiviert haben, sollten Sie mit dem obigen Code noch in Ordnung sein. Es sollte nur die Tabelle hinzufügen, wenn es migriert.

Ich tippe dies von meinem Telefon oder ich würde einen Code-Test zur Verfügung stellen.

+0

Muss ich TestingContext eine neue im Code ändern? Und was ist mit der Verbindungszeichenfolge? –

+0

Solange Sie noch automatische Migrationen eingerichtet haben, wird nur die Tabelle für Sie hinzugefügt. Es kann ein wenig unordentlich werden, wenn Sie die Arten von Spalten in einer bereits vorhandenen Datenbank ändern, aber wenn Sie nur eine Tabelle wie das oben genannte dbSet hinzufügen, dann werden nur die Befehle gesendet, um das Schema zu erhalten Kontextmodell. – MarkWalls

+0

Ich denke, dass Sie meinen Punkt vermissen. Bitte beachten Sie meine aktualisierte Verbindungszeichenfolge. Ursprünglich habe ich einen DB 'Initial Catalog = Testing 'erstellt, nun möchte ich die Tabellen zur vorhandenen DB' DevDB' hinzufügen. Ich denke, dass ich die Verbindungsschnur ändern muss, vielleicht auch Code. –

21

einfach Ihre neue Tabelle als Modell erstellen und seinen Eintrag hinzufügen in DbContext Klasse

so etwas wie

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

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

Dann add-migrations und update-database

+5

Für den Fall, dass es jemand anderem hilft, erwähne ich mein Facepalm. Stellen Sie sicher, dass Sie eine Eigenschaft und kein Feld verwenden. Es wird nur mit dem '{get; Set;} ' – Thomas

+0

Ahah! Das Eigentum vs. Feld hat mich erwischt. Danke @Thomas! – N1njaB0b

+0

Erstellen Sie einfach eine neue Klasse im Ordner "Model" und fügen Sie dann diese eine Zeile 'public DbSet MyNewModels {get; einstellen; } '? Weil ich es versucht habe, aber es hat nicht funktioniert. Es gab Fehler: Das Projekt konnte nicht aufgebaut werden. Wieso passiert mir das? – Nurul

0
  1. Aktivieren Sie Migrationen zuerst von der Paketmanagerkonsole aus.

  2. erstellen Konfigurationen Klasse wie

    namespace Demo.Data.Configurations 
    { 
        public class DemoConnectionConfiguration : EntityTypeConfiguration<DemoConnection> 
        { 
         public DemoConnectionConfiguration() 
         { 
          ToTable("DemoConnection"); 
          HasKey(a => a.Id); 
         } 
        } 
    } 
    
  3. hinzufügen Dbset und Model Builder in Context.cs wie

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

Hinweis: "Bitte wählen Sie den richtigen Ordner aus Standardprojekt Dropdown-Liste"

Congratulation! Ihre DemoConnection-Tabelle befindet sich jetzt in der Datenbank.

+0

Hallo, es scheint Ihnen zwei Konten haben (https://stackoverflow.com/users/5772608/chetan-pandey und https://stackoverflow.com/users/6782677/chetan-pandey). Wenn Sie möchten, können Sie die beiden Konten zusammenführen, indem Sie die Schritte unter https://stackoverflow.com/help/merging-accounts ausführen – Matt

Verwandte Themen