2016-06-27 7 views
6

Mam projekt, w którym moja domena jest podzielona między kilka oddzielnych złożeń i DbContexts, wszystkie używające tej samej bazowej bazy danych Sql Server. Zespoły te nie odwołują się do siebie z jednym wyjątkiem - jest taki, który zawiera to, co można nazwać współdzielonych jednostek, które są wspólne dla wszystkich innych domen i czasami określane jako właściwości nawigacyjne. Uproszczony przykład:Ignorowanie elementów z odwołanych złożeń podczas dodawania migracji

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

Problem polega na tym, że kiedy mam Hero POCO mowa w Game.dll modelu złożenia przez ICollection<Hero> Protagonists właściwości nawigacyjnych, nazywając:

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

kończy się w tworzeniu DbMigration że zawiera zmiany dla jednostki Hero z zadeklarowanego zestawu Shared.dll.

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

Jak mogę ograniczyć add-migration do monitorowania zmian tylko dla podmiotów znajdujących się w zespole, gdzie DbContext został zdefiniowany? Innymi słowy, po uruchomieniu add-migration przeciwko Games.dll Chcę zignorować wszelkie zmiany dokonane w jednostkach z Shared.dll.

To, co może również działać, to możliwość ograniczenia przez przestrzeń nazw lub schemat obiektów bazy danych. Po prostu nie chcę, aby zmiany w elementach znajdujących się w zestawach referencyjnych zostały uwzględnione w moich migracjach, ponieważ wszystkie migracje są zachowywane w ramach zestawu.

Odpowiedz

3

mam trick dla Ciebie, które można łatwo i można go używać (za pomocą modelBuilder.Ignore w MyDbContext), jeśli są zaznajomieni z ograniczonym kontekstach, to nie powinno być dla ciebie czymś nowym:

Twój 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; } 
} 

A teraz możesz dodatek migracja z linii poleceń tak:

dodatek migracji FirstDb -ConfigurationTypeName Configuration -CONNECTIONSTRINGNAME YourConnectionStrin g


Jest to wyjście dla podobnego podmiotu, który u wykorzystali w swoim przykładzie

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