我正在尝试使用数据库在新项目中设置数据库,但是仍然出现此问题:

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


我使用Web api文件夹创建了一个空的4.5项目。然后我添加了3个类库:BO(业务对象),BLL(业务逻辑)和DAL(数据访问层)。

首先,主应用程序具有带有这样的连接字符串的web.config

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


在我的BO图书馆中,我有2个班级和性别

基础

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


性别

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


在我的dal中,我有2个班级GenderDAL和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如下

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

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

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


问题发生在base(connstring),我的控制器是这样的

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

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


我的业务逻辑在这个阶段还不多,但是像这样

public class GenderBLL
{
    private GenderDAL db = null;

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

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


如果我查看服务器浏览器,则可以在数据连接下看到我已连接到数据库,但是不存在表。我认为这是我的问题,我不确定如何填充它,或者我错过了哪一步

最佳答案

您的问题与连接字符串无关。查看您的GenderDAL类:

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

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


您的GenderDAL类继承自AppContext,并且在构造函数内部,您正在创建new GenderDAL()(它递归地创建另一个嵌套的GenderDAL,依此类推,无限地进行)。这将导致无限递归,直到堆栈已满并且框架抛出StackOverflowException

我没有看到从AppContext继承DAL对象的任何正当理由,强烈建议您删除此类继承。

09-25 16:11