getter中的StackOverFlow异常

时间:2013-03-24 02:58:37

标签: c# exception stack-overflow

我正在使用Singleton设计模式,如果之前没有使用过,我必须返回该对象。 我在以下代码中得到一个例外:

namespace app.Models
{
    public class Conexion:DbContext
    {    
        private static Conexion Instance = null;
        private Conexion(string con) : base(con) { }
        public static Conexion MainConexion 
        {
            get {//error here
                if (Instance == null)
                {
                    Instance = new Conexion(@"Server=*****; User Id=***;Password=****; Database=****");
                }
                return Instance;
            }
        }
        public DbSet<label> Labels { get; set; }
        public DbSet<checke_status> CheckStatus { get; set; }

        public void SaveChanges()
        {
            MainConexion.SaveChanges();
        }
    }
}

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

删除SaveChanges方法的覆盖:

namespace app.Models
{
    public class Conexion : DbContext
    {
        private static Conexion Instance = null;

        private Conexion(string con) : base(con) { }

        public static Conexion MainConexion 
        {
            get
            { //error here
                if (Instance == null)
                {
                    Instance = new Conexion(
                        @"Server=*****; User Id=***;Password=****; Database=****");
                }

                return Instance;
            }
        }

        public DbSet<label> Labels { get; set; }

        public DbSet<checke_status> CheckStatus { get; set; }
    }
}

由于您有一个私有构造函数,因此可以使用的此类的唯一实例是MainConexion属性中公开的实例。看起来您试图确保在调用任何实例的SaveChanges方法时调用SaveChanges属性实例上的MainConnection方法。这不是必需的,因为您只能拥有Conexion类的一个实例,并且它是您要调用SaveChanges的实例。用法仍然相同:

Conexion.MainConexion.SaveChanges();

话虽如此,如果您不以这种方式实施,我认为您会有更好的运气。在需要时打开和关闭连接可能会更好,而不是依赖单个连接实例。如果连接中断会发生什么?不会出现任何错误,您的应用程序将被破坏。