5

J'ai développé l'application asp.net core wep api 2.0 avec EntityFrameworkCore.SqlServer 2.0. Il est développé en utilisant la première approche de base de données. Lorsque vous tentez d'accéder à des entités à l'aide de l'application dbcontext, le mode pause est activé. Je ne peux pas trouver la raison de l'état de l'application à l'état de rupture. S'il vous plaît, aidez à résoudre ceci.Pause d'application accédant à dbcontext, Asp. Net core api 2.0 avec la base de données d'entité framework core 2.0 première approche

Voici la méthode OnConfiguring dans la classe DBContext.

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) 
    { 
     if (!optionsBuilder.IsConfigured) 
     { 
      optionsBuilder.UseSqlServer(@"Server=(local);Database=VotingAppDB;User ID=sa;Password=123;"); 
     } 
    } 

Ci-dessous bloc de code utilisé pour accéder à dbcontext entités dans le contrôleur

// GET api/values 
    [HttpGet] 
    public IEnumerable<string> Get() 
    { 
     VotingAppDBContext context = new VotingAppDBContext(); 
     var questions = context.Questions.ToList(); 
     return new string[] { "value1", "value2" }; 
    } 

Installed packages

Application error

+0

J'ai le problème exact. Je n'ai aucune idée de comment le réparer jusqu'à présent. – hidden

+0

alors ... votre base de données a-t-elle des schémas? Quand j'ai enlevé mes schémas et puis échafaudé il a commencé à travailler. – hidden

+0

J'ai trouvé mon problème. J'ai utilisé VARCHAR (max) pour définir la longueur de la colonne.Effectivement, EF ne comprend pas cela et échoue silencieusement – hidden

Répondre

1

1.- Tout d'abord, vous ne devez pas créer un contexte à l'intérieur du contrôleur , évitez d'utiliser 'new' avec des dépendances car cela rendrait votre code impossible à tester, dans mon cas, lorsque j'utilise UnitOfWork, je l'injecte comme IUnitOfWork instan ce qui est, en effet, une extension de MyConext, et vous l'injecteriez dans la classe StartUp ... Pour ce faire j'ai une méthode privée (pour effectuer ceci dans un seul appel privé) qui ressemble à:

private private AddEntityFrameworkAndDbContext (services IServiceCollection) { services.AddEntityFrameworkSqlServer();

 var migrationsAssemblyName = typeof(MyContext).GetTypeInfo().Assembly.GetName().Name; 
     services.AddDbContext<MyContext>(options => 
     { 
      options.UseSqlServer(
       "MY CONNECTION STRING GOES HERE (BUT I RETREIVE IT FROM ANOTHER SERVICE)", 
       sqlServerOptionsAction: sqlOptions => 
       { 
        sqlOptions.MigrationsAssembly(migrationsAssemblyName); 
        sqlOptions.EnableRetryOnFailure(maxRetryCount: 5, maxRetryDelay: TimeSpan.FromSeconds(30), errorNumbersToAdd: null); 
       }); 
     }, 
     ServiceLifetime.Scoped // Showing explicitly that the DbContext is shared across the HTTP request scope (graph of objects started in the HTTP request) 
       ).AddUnitOfWork<MyContext>(); // This is because I'm also using EF Core Unit of work NuGet Package 
    } 

J'appelle cette méthode privée de ConfigureServices (services IServiceCollection), comme je l'ai dit, en classe StartUp

 // Add EF, and UoW 
     AddEntityFrameworkAndDbContext(services); 

2.- En second lieu (mais je dirais que c'est votre vrai problème) Je dirais que vous avez manqué base.OnConfiguring (options); dans votre contexte, il devrait être comme:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) 
    { 
     if (!optionsBuilder.IsConfigured) 
     { 
      optionsBuilder.UseSqlServer(@"Server=(local);Database=VotingAppDB;User ID=sa;Password=123;"); 
     } 
     base.OnConfiguring(optionsBuilder); 
    } 

En outre, s'il vous plaît, jetez un oeil à cette réponse que j'ai écrit il y a quelques semaines: How to setup EF6 Migrations with ASP.NET Core

En outre, ce projet UnitOfWork mérite une lecture, prendre regarder ici: https://github.com/arch/UnitOfWork

J'espère que cela aide,

Juan

0

pas sur e si le problème existe toujours. J'ai eu le même problème aujourd'hui. Le correctif était de mettre à jour tous les paquets de nuget (dans mon cas, Microsoft.Extensions.Configuration, etc) à la dernière version.

+0

Dans mon cas, cela est dû à la clé primaire auto-référencée. Lorsque j'ai supprimé cette référence, cela a fonctionné. –

-1

Cela se produit lorsque vous avez une clé primaire auto-référencée dans votre schéma. En utilisant le diagramme de la base de données du serveur SQL, vous pouvez l'afficher graphiquement. vous devez supprimer cette référence pour résoudre ce problème.