Zoeken…


Migraties inschakelen

Gebruik de opdracht om Code First Migrations in het entiteitskader in te schakelen

Enable-Migrations

op de Package Manager-console .

U moet een geldige DbContext implementatie hebben die uw databaseobjecten bevat die worden beheerd door EF. In dit voorbeeld bevat de databasecontext de objecten BlogPost en Author :

internal class DatabaseContext: DbContext
{
    public DbSet<Author> Authors { get; set; }

    public DbSet<BlogPost> BlogPosts { get; set; }
}

Na het uitvoeren van de opdracht moet de volgende uitvoer verschijnen:

PM> Enable-Migrations
Checking if the context targets an existing database...
Code First Migrations enabled for project <YourProjectName>.
PM>

Bovendien zou een nieuwe map Migrations moeten verschijnen met een enkel bestand Configuration.cs erin: DB Project-layout

De volgende stap zou zijn om uw eerste database-migratiescript te maken waarmee de eerste database wordt gemaakt (zie het volgende voorbeeld).

Voeg uw eerste migratie toe

Nadat u migraties hebt ingeschakeld (raadpleeg dit voorbeeld ), kunt u nu uw eerste migratie maken met een eerste creatie van alle databasetabellen, indexen en verbindingen.

Een migratie kan worden gemaakt met behulp van de opdracht

Add-Migration <migration-name>

Met deze opdracht maakt u een nieuwe klasse met twee methoden Up en Down die worden gebruikt om de migratie toe te passen en te verwijderen.

Pas nu de opdracht op basis van het bovenstaande voorbeeld toe om een migratie te maken met de naam Initial :

PM> Add-Migration Initial
Scaffolding migration 'Initial'.
The Designer Code for this migration file includes a snapshot of your current Code
First model. This snapshot is used to calculate the changes to your model when you
scaffold the next migration. If you make additional changes to your model that you 
want to include in this migration, then you can re-scaffold it by running 
'Add-Migration Initial' again.

Een nieuw bestand timestamp _Initial.cs wordt gemaakt (alleen de belangrijke dingen worden hier getoond):

public override void Up()
{
   CreateTable(
       "dbo.Authors",
        c => new
           {
               AuthorId = c.Int(nullable: false, identity: true),
               Name = c.String(maxLength: 128),
           })
        .PrimaryKey(t => t.AuthorId);
        
    CreateTable(
       "dbo.BlogPosts",
       c => new
           {
                Id = c.Int(nullable: false, identity: true),
                Title = c.String(nullable: false, maxLength: 128),
                Message = c.String(),
                Author_AuthorId = c.Int(),
            })
        .PrimaryKey(t => t.Id)
        .ForeignKey("dbo.Authors", t => t.Author_AuthorId)
        .Index(t => t.Author_AuthorId);
}
    
public override void Down()
{
    DropForeignKey("dbo.BlogPosts", "Author_AuthorId", "dbo.Authors");
    DropIndex("dbo.BlogPosts", new[] { "Author_AuthorId" });
    DropTable("dbo.BlogPosts");
    DropTable("dbo.Authors");
}

Zoals u kunt zien, worden in methode Up() twee tabellen Authors en BlogPosts gemaakt en worden de velden dienovereenkomstig gemaakt. Bovendien wordt de relatie tussen de twee tabellen gemaakt door het veld Author_AuthorId toe te voegen. Aan de andere kant probeert de methode Down() de migratie-activiteiten om te keren.

Als u zeker bent van uw migratie, kunt u de migratie toepassen op de database met behulp van de opdracht:

Update-Database

Alle uitstaande migraties (in dit geval de initiële migratie) worden toegepast op de database en daarna wordt de seed-methode toegepast (het juiste voorbeeld)

PM> update-database
Specify the '-Verbose' flag to view the SQL statements being applied to the target     
database.
Applying explicit migrations: [201609302203541_Initial].
Applying explicit migration: 201609302203541_Initial.
Running Seed method.

U kunt de resultaten van de activiteiten bekijken in de SQL-verkenner: database overzicht

Voor de opdrachten Add-Migration en Update-Database verschillende opties beschikbaar die kunnen worden gebruikt om de activiteiten aan te passen. Gebruik om alle opties te bekijken

get-help Add-Migration

en

get-help Update-Database

Gegevens zaaien tijdens migraties

Na het inschakelen en maken van migraties kan het nodig zijn om in eerste instantie gegevens in uw database te vullen of te migreren. Er zijn verschillende mogelijkheden, maar voor eenvoudige migraties kunt u de methode 'Seed ()' gebruiken in het bestand Configuratie gemaakt na het aanroepen van enable-migrations .

De functie Seed() haalt een databasecontext op, omdat dit de enige parameter is en u binnen deze functie EF-bewerkingen kunt uitvoeren:

protected override void Seed(Model.DatabaseContext context);

U kunt alle soorten activiteiten uitvoeren in Seed() . In geval van een storing wordt de volledige transactie (zelfs de aangebrachte patches) teruggedraaid.

Een voorbeeldfunctie die alleen gegevens maakt als een tabel leeg is, kan er zo uitzien:

protected override void Seed(Model.DatabaseContext context)
{
    if (!context.Customers.Any()) {
        Customer c = new Customer{ Id = 1, Name = "Demo" };
        context.Customers.Add(c);
        context.SaveData();
    }
}

Een leuke functie van de EF-ontwikkelaars is de uitbreidingsmethode AddOrUpdate() . Met deze methode kunt u gegevens bijwerken op basis van de primaire sleutel of gegevens invoegen als deze nog niet bestaat (het voorbeeld is afkomstig uit de gegenereerde broncode van Configuration.cs):

protected override void Seed(Model.DatabaseContext context)
{
    context.People.AddOrUpdate(
      p => p.FullName,
      new Person { FullName = "Andrew Peters" },
      new Person { FullName = "Brice Lambson" },
      new Person { FullName = "Rowan Miller" }
    );
}

Houd er rekening mee dat Seed() wordt aangeroepen nadat de laatste patch is toegepast. Als u tijdens patches moet migreren of gegevens moet zaaien, moeten andere benaderingen worden gebruikt.

Sql () gebruiken tijdens migraties

Bijvoorbeeld: u gaat een bestaande kolom migreren van niet-vereist naar vereist. In dit geval moet u mogelijk enkele standaardwaarden in uw migratie invullen voor rijen waarvan de gewijzigde velden feitelijk NULL . In het geval dat de standaardwaarde eenvoudig is (bijvoorbeeld "0"), kunt u een default of defaultSql eigenschap gebruiken in uw kolomdefinitie. In het geval dat het niet zo eenvoudig is, kunt u de functie Sql() gebruiken in de Sql() Up() of Down() van uw migraties.

Hier is een voorbeeld. Uitgaande van een klasse- auteur die een e-mailadres bevat als onderdeel van de gegevensset. Nu besluiten we het e-mailadres als verplicht veld in te voeren. Om bestaande kolommen te migreren, heeft het bedrijf het slimme idee om dummy e-mailadressen te maken zoals [email protected] , waarbij volledige naam de volledige naam van de auteur zonder spaties is. Het toevoegen van het kenmerk [Required] aan het veld Email zou de volgende migratie veroorzaken:

public partial class AuthorsEmailRequired : DbMigration
{
    public override void Up()
    {
        AlterColumn("dbo.Authors", "Email", c => c.String(nullable: false, maxLength: 512));
    }
    
    public override void Down()
    {
        AlterColumn("dbo.Authors", "Email", c => c.String(maxLength: 512));
    }
}

Dit zou mislukken als sommige NULL-velden zich in de database bevinden:

Kan de waarde NULL niet invoegen in kolom 'E-mail', tabel 'App.Model.DatabaseContext.dbo.Authors'; kolom staat geen nullen toe. UPDATE mislukt.

Het toevoegen van het volgende zoals voor de opdracht AlterColumn helpt:

Sql(@"Update dbo.Authors
    set Email = REPLACE(name, ' ', '') + N'@example.com'
    where Email is null");

De update-database aanroep is geslaagd en de tabel ziet er als volgt uit (voorbeeldgegevens weergegeven):

Voorbeeld van auteursgegevens

Ander gebruik

U kunt de functie Sql() voor alle soorten DML- en DDL-activiteiten in uw database. Het wordt uitgevoerd als onderdeel van de migratietransactie; Als de SQL mislukt, mislukt de volledige migratie en wordt er teruggedraaid.

Bezig met "Update-Database" binnen uw code

Toepassingen die worden uitgevoerd in niet-ontwikkelingsomgevingen vereisen vaak database-updates. Nadat u de opdracht Add-Migration hebt gebruikt om uw databasepatches te maken, moet u de updates uitvoeren in andere omgevingen en vervolgens ook in de testomgeving.

Veel voorkomende uitdagingen zijn:

  • geen Visual Studio geïnstalleerd op productieomgevingen, en
  • geen verbindingen toegestaan naar verbinding / klantomgevingen in het echte leven.

Een tijdelijke oplossing is de volgende codereeks die controleert of er updates worden uitgevoerd en deze in volgorde uitvoert. Zorg voor correcte transacties en uitzonderingsafhandeling om ervoor te zorgen dat er geen gegevens verloren gaan in geval van fouten.

void UpdateDatabase(MyDbConfiguration configuration) {
   DbMigrator dbMigrator = new DbMigrator( configuration);
   if ( dbMigrator.GetPendingMigrations().Any() )
   {
      // there are pending migrations run the migration job
      dbMigrator.Update(); 
   }
}

waarbij MyDbConfiguration uw migratie-instelling ergens in uw bronnen is:

public class MyDbConfiguration : DbMigrationsConfiguration<ApplicationDbContext>

Initiële entiteit Framework Code Eerste migratie stap voor stap

  1. Maak een consoletoepassing.
  2. Installeer EntityFramework nuget-pakket door Install-Package EntityFramework in "Package Manager Console"
  3. Voeg uw verbindingsreeks in het app.config-bestand toe. Het is belangrijk om providerName="System.Data.SqlClient" in uw verbinding op te nemen.
  4. Maak een openbare klas zoals je wilt, zoiets als " Blog "
  5. Maak uw ContextClass die erven van DbContext, zoiets als " BlogContext "
  6. Definieer een eigenschap in uw context van het type DbSet, zoiets als dit:
public class Blog 
{
    public int Id { get; set; }

    public string Name { get; set; }
}
public class BlogContext: DbContext
{
    public BlogContext(): base("name=Your_Connection_Name")
    {
    }

    public virtual DbSet<Blog> Blogs{ get; set; }
}
  1. Het is belangrijk om de verbindingsnaam door te geven in constructor (hier Your_Connection_Name)
  2. Voer in de Package Manager-console de opdracht Enable-Migration uit. Hiermee wordt een migratiemap in uw project gemaakt
  3. Voer de opdracht Add-Migration Your_Arbitrary_Migraiton_Name uit, hierdoor wordt een migratieklasse in de migratiemap gemaakt met twee methoden Up () en Down ()
  4. Voer de opdracht Update-Database om een database met een blogtabel te maken


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow