2016-03-23 1 views
0

Dans l'une de nos applications .Net, nous avons un grand DBContext avec toutes les entités. Afin d'accélérer l'instanciation du DBContext, j'essaye de décomposer le DBContext en plus petits morceaux.Comment se débarrasser des erreurs de validation de modèle sur des entités qui ne sont pas dans mon DBContext?

classe Mon DBContext ressemble à ceci:

public class DALContext : DBContext 
{ 
    static DALContext() 
    { 
     Database.SetInitializer<DALContext>(null); 
    } 

    public DALContext(string connectionString) 
     : base(connectionString) 
    { 
     this.Configuration.ProxyCreationEnabled = false; 
     this.Configuration.LazyLoadingEnabled = false; 
     this.Configuration.AutoDetectChangesEnabled = true; 

     IObjectContextAdapter objectContextAdapter = this as IObjectContextAdapter; 
     if (objectContextAdapter.ObjectContext != null) 
     { 
      objectContextAdapter.ObjectContext.CommandTimeout = 300; 
     } 
    } 

    public DbSet<tblMyEntity> tblMyEntities { get; set; } 

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

} 

Essayer d'initialiser le DBContext dans un résultat UnitTest dans l'erreur suivante avec un message:

System.Data.Entity.Edm.EdmEntityType: : EntityType 'tblPropertyValue' has no key defined. Define the key for this EntityType. 
System.Data.Entity.Edm.EdmEntitySet: EntityType: EntitySet 'tblPropertyValues' is based on type 'tblPropertyValue' that has no keys defined. 

Et un stacktrace qui ressemble à ceci :

bei System.Data.Entity.ModelConfiguration.Edm.EdmModelExtensions.ValidateAndSerializeCsdl(EdmModel model, XmlWriter writer) 
bei System.Data.Entity.DbModelBuilder.Build(DbProviderManifest providerManifest, DbProviderInfo providerInfo) 
bei System.Data.Entity.DbModelBuilder.Build(DbConnection providerConnection) 
bei System.Data.Entity.Internal.LazyInternalContext.CreateModel(LazyInternalContext internalContext) 
bei System.Data.Entity.Internal.RetryLazy`2.GetValue(TInput input) 
bei System.Data.Entity.Internal.LazyInternalContext.InitializeContext() 
bei System.Data.Entity.Internal.InternalContext.ForceOSpaceLoadingForKnownEntityTypes() 
bei System.Data.Entity.DbContext.System.Data.Entity.Infrastructure.IObjectContextAdapter.get_ObjectContext() 
bei DAL.DALContext..ctor(String connectionString) 

Le problème où je me perds, est que le DBSet wi La classe tblPropertyValue n'est pas déclarée dans mon DBContext.

L'EntitySet 'tblPropertyValues' est déclaré dans cet autre grand DBContext, qui utilise la même chaîne DBConnection-String. Mais l'autre DBContext n'est pas instancié par mon UnitTest.

Qu'est-ce que je fais mal?

Mise à jour: Le problème a été provoqué par une classe de base de toutes les entités dont une méthode renvoyait toutes les classes enfant pour l'attribut known-types pour WCF.

+0

Utilisez-vous le concepteur EDMX? Je me souviens que le concepteur pour EF4 avait beaucoup de problèmes et souvent les modifications apportées au concepteur n'étaient pas reflétées correctement dans les fichiers associés (CSDL et SSDL). Je me souviens d'avoir ouvert un de ces fichiers dans le passé et de corriger manuellement certains paramètres liés à l'identité. Peut-être que c'est le problème, un de ces fichiers contient des références à cette table? – CodingGorilla

+0

Non - pas de concepteur. – boutta

Répondre

1

boutta, j'essaie vraiment de vous aider. L'exception que vous voyez est une exception EF très courante. Cela vous indique que EF ne peut pas déterminer le mappage de toutes les propriétés de l'objet. Vous n'avez pas fourni le mappage d'objet EF, il essaie donc de faire le mappage pour vous et il ne le peut pas. La solution à votre problème consiste à créer une classe de mappage. Voir https://msdn.microsoft.com/en-us/data/jj591617.aspx

Effectuez les opérations suivantes pour fixer et votre classe fonctionnera:

  1. Créer une classe qui hérite de EntityTypeConfiguration
  2. Configurer EF pour ignorer la propriété tblPropertyValues ​​
  3. En cas DbContext OnModelCreating utiliser la nouvelle classe Mapper

Le code ressemblerait à ceci

public class tblMyEntityMapper : EntityTypeConfiguration<tblMyEntityMap> 
{ 
     public tblMyEntityMapper() 
     { 
      this.Ignore(t => t. tblPropertyValues); 
     } 
} 

Et dans le changement du DbContext à cette

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

EF est très indulgent et il sera automatiquement la carte le reste de vos propriétés si elles correspondent aux noms de colonnes.

+0

Non! Le problème n'est pas le mappage de tblMyEntity mais le mappage de tblPropertyValue qui n'est même pas utilisé ou référencé dans mon DBContext. – boutta

+0

Dans votre mappage, dites à EF d'ignorer cette propriété et EF n'essaiera pas de résoudre le mappage pour cette propriété this.Ignore (t => t.Property); – fremis

+0

Je n'ai pas de mappage de la classe référencée dans mon contexte! Donc je ne peux rien dire !!! – boutta