2017-10-17 12 views
0

Supposons que j'aie 3 entités: A, B et C;Code First Migration veut [re] créer la table pour une entité qui se trouve dans un DbContext différent

public class A // Target entity 
{ 
    public int Foo { get; set; } 
    public int Bar { get; set; } 
} 

public class B 
{ 
    public virtual ICollection<C> C { get; set; } // Navigation to C 
} 

public class C 
{ 
    public virtual A A { get; set; } // Navigation to A 
} 

... et actuellement un seul contexte: X

public abstract class Context : DbContext 
{ 
    protected const string CONNECTION_NAME = "some_connection_name"; 
    protected const string SCHEMA_NAME = "dbo"; 

    public Context() : base(CONNECTION_NAME) 
    { 
     Database.Log = message => Debug.WriteLine(message); 
    } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.HasDefaultSchema(SCHEMA_NAME); 
     modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); 
     modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>(); 
     modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>(); 
    } 
} 

public class X : Context 
{ 
    public DbSet<A> A { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Configurations.Add(new AConfiguration()); 
     base.OnModelCreating(modelBuilder); 
    } 
} 

Le problème est que je suis l'ajout d'un deuxième contexte (Y) et donc l'entité points C à A par une propriété de navigation , Code First Migrations veut [re] créer une table pour l'entité A, cependant elle existe déjà.

public class Y : Context 
{ 
    public DbSet<B> B { get; set; } 

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

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Configurations.Add(new BConfiguration()); 
     modelBuilder.Configurations.Add(new CConfiguration()); 
     base.OnModelCreating(modelBuilder); 
    } 
} 

Comment puis-je surmonter cela?

Répondre

0

Le deuxième contexte devrait Ignore explicitement l'entité A:

public class Y : Context 
{ 
    public DbSet<B> B { get; set; } 

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

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Configurations.Add(new BConfiguration()); 
     modelBuilder.Configurations.Add(new CConfiguration()); 

     modelBuilder.Ignore<A>(); 

     base.OnModelCreating(modelBuilder); 
    } 
} 
+0

est-il un moyen plus facile de le faire, parce que les autres entités sont ajoutées en tant que dépendances (propriétés de navigation pour les entités dans un contexte différent), plus est le mal de tête. –

+0

Pas que je sache. J'essaie toujours de garder les modèles de classe appartenant à des contextes différents les uns des autres. Quand j'ai besoin d'une entité dans plusieurs contextes, je préfère dupliquer la classe plutôt que de réutiliser une classe (comme: une entité 'User' dans le contexte métier principal et une entité' AuthorizationUser' dans le contexte d'autorisation, ayant uniquement les associations dont ils ont besoin agrégat spécifique de l'application mais mappé à la même table). –