【问题标题】:Setting connection in n-tier c# layer在 n 层 c# 层中设置连接
【发布时间】:2016-08-16 10:14:04
【问题描述】:

我正在尝试使用数据库在我的新项目中设置我的数据库,但是我一直遇到这个问题:

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();
    }
}

如果我查看我的服务器资源管理器,我可以在数据连接下看到我已连接到数据库,但是不存在表。我相信这是我的问题,我不知道如何填充它,或者我错过了什么步骤

【问题讨论】:

    标签: c# asp.net asp.net-mvc-4 asp.net-web-api asp.net-web-api2


    【解决方案1】:

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

    public class GenderDAL : AppContext
    {
        private AppContext db = null;
    
        public GenderDAL()
        {
            db = new GenderDAL();
        }
        //..
    

    您的GenderDAL 类继承自AppContext,并且在您的构造函数中创建了一个new GenderDAL()(它递归地创建另一个嵌套的GenderDAL,以此类推,无限循环)。这会导致无限递归,直到堆栈变满并且框架抛出 StackOverflowException

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

    【讨论】:

    • 嘎啊啊啊啊。我没看到那个!我同意,删除继承。
    • 这给我带来了一个新问题,所以我所做的被删除了:Appcontext,现在我得到了这个 EntityFramework.dll 中发生了“System.ArgumentException”类型的异常,但未在用户中处理代码附加信息:具有不变名称“.NET Framework Data Provider for SQL Server”的 ADO.NET 提供程序未在计算机或应用程序配置文件中注册,或者无法加载。有关详细信息,请参阅内部异常。
    • 如果您使用的是本地数据库版本 13 michael-whelan.net/sql-server-localdb-2014-connection-string,请查看此链接
    【解决方案2】:

    试试

        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

    您可以从这里获取“种子数据”示例:

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

    同时检查您的连接字符串和配置。

    示例(基于 Northwind)

    <?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>
    

    【讨论】:

    • 不幸的是,当我转到 localhost:53069/api/gender 时,我仍然收到 system.core.dll 中发生的 system.stack.overflowexception 类型的未处理异常。问题出现在这里 public AppContext() : base("ConnString")
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-14
    • 1970-01-01
    • 1970-01-01
    • 2011-06-16
    • 2017-12-14
    • 1970-01-01
    • 2013-02-24
    相关资源
    最近更新 更多