2016-06-27 71 views
6

Ho un progetto in cui il mio dominio è suddiviso tra un gruppo di assembly separati e DbContexts, tutti utilizzando lo stesso database Sql Server sottostante. Questi assembly non si fanno riferimento l'un l'altro con un'eccezione: ce n'è uno che contiene ciò che si potrebbe chiamare entità condivise, che sono comuni a tutti gli altri domini e talvolta fanno riferimento come proprietà di navigazione. esempio semplificato:Ignorare le entità dagli assembly referenziati durante l'aggiunta della migrazione

// Shared.dll 
namespace Shared 
{ 
    // Shared POCO 
    class Hero 
    { 
     public string Name { get; set; } 
     public string Description { get; set; } 
    } 

    class MyDbContext : DbContext 
    { 
     public virtual DbSet<Hero> Heroes { get; set; } 
    } 

    internal sealed class MyDbContextConfiguration : DbMigrationsConfiguration<MyDbContext> 
    { 
     public MyDbContextConfiguration() 
     { 
      AutomaticMigrationsEnabled = false; 
      MigrationsDirectory = @"Migrations\MyDbContext"; 
      ContextKey = "Shared"; 
     } 
    } 
} 

// Game.dll <- references Shared.dll 
namespace Game 
{ 
    // Individual POCO 
    class Mission 
    { 
     public string Name { get; set; } 
     public virtual ICollection<Hero> Protagonists { get; set; } 
    } 

    class MyDbContext : DbContext 
    { 
     public virtual DbSet<Mission> Missions { get; set; } 
    } 

    internal sealed class MyDbContextConfiguration : DbMigrationsConfiguration<MyDbContext> 
    { 
     public MyDbContextConfiguration() 
     { 
      AutomaticMigrationsEnabled = false; 
      MigrationsDirectory = @"Migrations\MyDbContext"; 
      ContextKey = "Game"; 
     } 
    } 
} 

Il problema è che quando ho Hero POCO riferimento nel Game.dll modello di assieme attraverso ICollection<Hero> Protagonists proprietà di navigazione, chiamando:

add-migration Test -ProjectName:Game -ConfigurationTypeName MyDbContextConfiguration -StartUpProjectName Main 

finisce nella creazione DbMigration che include le modifiche per l'entità Hero dal gruppo di riferimento Shared.dll condiviso.

public partial class Test : DbMigration 
    { 
     public override void Up() 
     { 
      AddColumn("shared.Heroes", "Name", c => c.String()); 
      AddColumn("shared.Heroes", "Description", c => c.String()); 
      ... 

Come posso limitare add-migration al monitoraggio dei cambiamenti solo per entità situate nel gruppo in cui è stato definito il DbContext? In altre parole, quando si esegue add-migration in Games.dll Voglio ignorare tutte le modifiche apportate alle entità da Shared.dll.

Ciò che potrebbe funzionare sarebbe anche la possibilità di limitare per schema di namespace o di database. Non voglio che vengano apportate modifiche alle entità situate negli assembly di riferimento da includere nelle migrazioni, poiché tutte le migrazioni vengono mantenute per ogni assembly.

risposta

3

Ho un trucco per voi, che è facile e si può utilizzare (utilizzando modelBuilder.Ignore nel vostro MyDbContext), se conosci la Bounded Contesti, allora questo non dovrebbe essere una novità per voi:

tuo DbContext:

public class MyDbContext : DbContext 
{ 
    private readonly bool _isMigrationMode; 

    public MyDbContext() 
    { 
    // This used by migration default and you can give the connection string in the command line. 
    _isMigrationMode = true; 
    } 

    // isMigrationMode: I have give it here as an optional parameter, in case, if you want to create the migration from the code. 
    public MyDbContext(string connectionString, bool isMigrationMode = false) 
     : base("name=" + connectionString) 
    { 
    _isMigrationMode = isMigrationMode; 
    } 
    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
    if (_isMigrationMode) 
    { 
     modelBuilder.Ignore<Hero>(); 
    } 

    base.OnModelCreating(modelBuilder); 
    } 

    public DbSet<Mission> Missions { get; set; } 
} 

e ora è possibile l'add-migrazione dalla riga di comando del genere:

add-migrazione FirstDb -ConfigurationTypeName configurazione -CONNECTIONSTRINGNAME YourConnectionStrin g


Questa è l'uscita per un'entità simile che u hanno utilizzato nel tuo esempio

public partial class FirstDb : DbMigration 
{ 
    public override void Up() 
    { 
     CreateTable(
      "dbo.Missions", 
      c => new 
       { 
        MissionId = c.Long(nullable: false, identity: true), 
        Amount = c.Int(nullable: false), 
        Amount2 = c.Int(nullable: false), 
        HeroId = c.Long(nullable: false), 
       }) 
      .PrimaryKey(t => t.MissionId); 

    } 

    public override void Down() 
    { 
     DropTable("dbo.Missions"); 
    } 
} 
Problemi correlati