2

Ich versuche, meine Datenbank in meinem neuen Projekt mit einer Datenbank einzurichten, jedoch halte ich dieses Problem bekommen:Rahmen Verbindung in n-tier C# Schicht

An unhandled exception of type 'System.StackOverflowException' occurred in System.Core.dll 

Ich habe ein leeres 4,5-Projekt Web-api Ordner mit . Dann habe ich 3 Klassenbibliothek, BO (Business Ojcect), BLL (Geschäftslogik) und DAL (Datenzugriffsschicht) hinzugefügt.

Zuerst die Haupt-App hat web.config mit einer Verbindungszeichenfolge wie diese

<connectionStrings> 
    <add name="ConnString" connectionString="Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=Quantico;Integrated Security=True" providerName=".NET Framework Data Provider for SQL Server"/> 
    </connectionStrings> 

In meinem BO Bibliothek I 2 Klasse Basis haben und Geschlecht

Basis

public abstract class Base 
{ 
    public int ID { get; set; } 
    public Boolean isValid { get; set; } 
    public DateTime createdOn { get; set; } 
    public int createdID { get; set; } 
    /*public Person createdPerson { get; set; }*/ 
    public DateTime updatedOn { get; set; } 
    public int updatedID { get; set; } 
    /*public Person updatedPerson { get; set; }*/ 
} 

Geschlecht

public class Gender : Base 
{ 
    public string Description { get; set; } 
} 

In meinem dal Ich habe 2 Klasse GenderDAL und Appcontext

AppContext is like this 
    public class AppContext : DbContext 
    { 
     public AppContext() : base("ConnString") 
     { 
     } 

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

     protected override void OnModelCreating(DbModelBuilder modelBuilder) 
     { 
      base.OnModelCreating(modelBuilder); 

      modelBuilder.Entity<Gender>().ToTable("Gender"); 
      modelBuilder.Entity<Gender>().HasKey(x => x.ID); 
      modelBuilder.Entity<Gender>().Property(x => x.Description).HasMaxLength(255); 
      modelBuilder.Entity<Gender>().Property(x => x.Description).IsRequired(); 
      modelBuilder.Entity<Gender>().Property(x => x.createdID).IsRequired(); 
      modelBuilder.Entity<Gender>().Property(x => x.createdOn).IsRequired(); 
     } 
    } 

GenderDAL als

public class GenderDAL : AppContext 
    { 
     private AppContext db = null; 

     public GenderDAL() 
     { 
      db = new GenderDAL(); 
     } 

     public IEnumerable<Gender> GetGenders() 
     { 
      return db.Gender.ToList<Gender>(); 
     } 
    } 

Das Problem tritt an der Basis (CONNSTRING) und mein Controller ist wie folgt

public class GenderController : ApiController 
{ 
    private GenderBLL db = null; 

    [HttpGet] 
    public IEnumerable<Gender> Genders() 
    { 
     db = new GenderBLL(); 
     return db.GetGenders(); 
    } 
} 

folgen und meine Geschäftslogik ist in diesem Stadium nicht viel, aber es ist so

public class GenderBLL 
{ 
    private GenderDAL db = null; 

    #region constructor 
    public GenderBLL() 
    { 
     db = new GenderDAL(); 
    } 
    #endregion 

    public IEnumerable<Gender> GetGenders() 
    { 
     return db.GetGenders(); 
    } 
} 

Wenn ich meinen Server Explorer anschaue, kann ich unter Datenverbindung sehen, dass ich mit der Datenbank verbunden bin, aber keine Tabelle existiert. Ich glaube, dass meine Probleme sind, und ich bin nicht sicher, wie es entweder zu füllen, oder welcher Schritt habe ich verpaßt

Antwort

4

Ihr Problem hat nichts mit der Verbindungszeichenfolge zu tun. Ein Blick auf Ihre GenderDAL Klasse:

public class GenderDAL : AppContext 
{ 
    private AppContext db = null; 

    public GenderDAL() 
    { 
     db = new GenderDAL(); 
    } 
    //.. 

Ihre GenderDAL Klasse von AppContext erbt, und in Ihrem Konstruktor Sie eine new GenderDAL() erstellen (die verschachtelte GenderDAL erzeugt rekursiv eine andere, und so weiter, unendlich). Dies verursacht eine unendliche Rekursion, bis der Stapel voll wird und das Framework eine StackOverflowException auslöst.

Ich sehe keine gültigen Gründe für die Übernahme Ihrer DAL-Objekte von AppContext und ich empfehle Ihnen dringend, diese Vererbung zu entfernen.

+0

Gaaaaaaaaa. Das habe ich nicht gesehen! Ich stimme zu, entfernen Sie die Erbschaft. – granadaCoder

+0

Diese verursachen mir eine neue Probleme, so was ich tat, entfernt wird,: Appcontext und jetzt bekomme ich dieses eine Ausnahme vom Typ ‚System.ArgumentException‘ auftrat in EntityFramework.dll wurde aber in Benutzercode Zusätzliche Informationen nicht behandelt : Der ADO.NET-Provider mit dem invarianten Namen '.NET Framework-Datenprovider für SQL Server' ist entweder nicht in der Computer- oder Anwendungskonfigurationsdatei registriert oder konnte nicht geladen werden. Weitere Informationen finden Sie in der inneren Ausnahme. – Jseb

+0

Überprüfen Sie diesen Link, wenn Sie lokale db-Version 13 verwenden http://www.michael-whelan.net/sql-server-localdb-2014-connection-string/ –

1

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 


     modelBuilder.Entity<Gender>().ToTable("Gender"); 
     modelBuilder.Entity<Gender>().HasKey(x => x.ID); 
     modelBuilder.Entity<Gender>().Property(x => x.Description).HasMaxLength(255); 
     modelBuilder.Entity<Gender>().Property(x => x.Description).IsRequired(); 
     modelBuilder.Entity<Gender>().Property(x => x.createdID).IsRequired(); 
     modelBuilder.Entity<Gender>().Property(x => x.createdOn).IsRequired(); 

    /* optional addition */ 
    modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); 

     base.OnModelCreating(modelBuilder); 

    } 

PS Versuchen

Sie können ein „Seed-Daten“ Beispiel erhalten von hier:

https://github.com/ProgrammingAspNetMvcBook/CodeExamples/tree/master/Ebuy.Common/DataAccess

überprüfen Sie auch Ihre Verbindungszeichenfolge und Konfig.

Beispiel (basierend auf Nordwind)

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <configSections> 
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --> 
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> 
    </configSections> 
    <connectionStrings> 
    <add name="NorthwindContext" connectionString="Data Source=MyServer\Instance;Initial Catalog=Northwind;Integrated Security=True;MultipleActiveResultSets=True;Application Name='Northwindy'" 
     providerName="System.Data.SqlClient" /> 
    </connectionStrings> 
    <entityFramework> 
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" /> 
    <providers> 
     <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> 
    </providers> 
    </entityFramework> 
</configuration> 
+0

leider, wenn ich auf http: // localhost: 53069/api/gender gehen Ich habe immer noch die unbehandelte Ausnahme vom Typ system.stack.overflowException in system.core.dll aufgetreten. Das Problem tritt hier öffentliche AppContext(): Base ("ConnString") – Jseb