C# 如何使用ASP.NET MVC项目参考从控制台应用程序使用ASP.NET MVC的MYSQL DbContext

C# 如何使用ASP.NET MVC项目参考从控制台应用程序使用ASP.NET MVC的MYSQL DbContext,c#,asp.net,.net,asp.net-mvc,topshelf,C#,Asp.net,.net,Asp.net Mvc,Topshelf,我正在尝试从.NET控制台应用程序编写一个Windows服务,该应用程序执行在MySQL数据库中发布数据的操作。我试图使用ASP.NET项目中的DbContext类,但是当我运行控制台应用程序时,数据不会被发布。我正在使用Topshelf依赖项来创建Windows服务并使调试更容易 我的控制台应用程序代码如下所示: public class UpdateReceivePost { private readonly Timer timer;// To establish time

我正在尝试从.NET控制台应用程序编写一个Windows服务,该应用程序执行在MySQL数据库中发布数据的操作。我试图使用ASP.NET项目中的
DbContext
类,但是当我运行控制台应用程序时,数据不会被发布。我正在使用Topshelf依赖项来创建Windows服务并使调试更容易

我的控制台应用程序代码如下所示:

public class UpdateReceivePost
{
        private readonly Timer timer;// To establish time for service

        public UpdateReceivePost()
        {
            timer = new Timer(1000) { AutoReset = true }; // the service will start in one minute 
            timer.Elapsed += TimerElapsed;//calls a timeelapsed mehodd
        }

        protected IDbFactory DbFactory { get; private set; }

        private void TimerElapsed(object sender, ElapsedEventArgs e)
        {
            UserDbContext dbContext = new UserDbContext();

            ReceivePost receivePost = new ReceivePost()
            {
                Status = "pending"
            };

            dbContext.receivePosts.Add(receivePost);
            dbContext.SaveChanges();

            // string[] lines = new string[] { DateTime.Now.ToString() };
            // File.AppendAllLines(@"F:\nepal.txt", lines);
        }

        public void Start()
        {
            timer.Start();//start the timer
        }

        public void Stop()
        {
            timer.Stop(); //stops the timer
        }
} 

您应该将dbContext类包装在using语句中,以便在发布到db后将其释放

上下文的生存期从实例创建和运行时开始 当实例被释放或垃圾回收时结束。使用 如果希望上下文控制的所有资源都是 设置在块的末端。使用时,编译器 在中自动创建try/finally块并调用dispose 最后一个街区

尝试重新安装具有这些版本的软件包,并查看错误是否消失

private void TimerElapsed(object sender, ElapsedEventArgs e)
 {
    ReceivePost receivePost = new ReceivePost()
    {
       Status = "pending"
    };

    using(UserDbContext dbContext = new UserDbContext())
    {
        dbContext.receivePosts.Add(receivePost);
        dbContext.SaveChanges();
    }

    // string[] lines = new string[] { DateTime.Now.ToString() };
   // File.AppendAllLines(@"F:\nepal.txt", lines);
}

为什么dbcontext没有包装在using语句中。我不认为你在使用DI@ShahidManzoorBhat你能告诉我怎么做吗?这解决了我的问题吗?您应该始终将dbContext包装在using块中,除非您为自己DI处理它。您是否也可以发布在运行应用程序时遇到的错误或异常code@ShahidManzoorBhat我的错误在dbContext.receivepost.Add(receivepost)抛出;System.Data.Entity.Core.ProviderIncompatibleException:“提供程序未返回ProviderManifestToken字符串。”内部异常:MethodAccessException:尝试通过方法“MySql.Data.MySqlClient.MySqlProviderServices.GetDbProviderManifestToken(System.Data.Common.DbConnection)”访问方法“MySql.Data.MySqlClient.MySqlConnection.get_Settings()”失败。将上下文类放入USE块后是否仍会抛出该方法。如果是,请发布错误消息。使用对我无效。。我的错误在dbContext.receivepost.Add(receivepost)抛出;System.Data.Entity.Core.ProviderIncompatibleException:“提供程序未返回ProviderManifestToken字符串。”内部异常:MethodAccessException:尝试通过方法“MySql.Data.MySqlClient.MySqlProviderServices.GetDbProviderManifestToken(System.Data.Common.DbConnection)”访问方法“MySql.Data.MySqlClient.MySqlConnection.get_Settings()'失败。@ShahidManzoorBhatt我正在使用实体框架版本6.4.0感谢您为我所说的使用mysql.data和mysql..data.entiyy的版本对我有效@沙希德曼齐尔巴特
private void TimerElapsed(object sender, ElapsedEventArgs e)
 {
    ReceivePost receivePost = new ReceivePost()
    {
       Status = "pending"
    };

    using(UserDbContext dbContext = new UserDbContext())
    {
        dbContext.receivePosts.Add(receivePost);
        dbContext.SaveChanges();
    }

    // string[] lines = new string[] { DateTime.Now.ToString() };
   // File.AppendAllLines(@"F:\nepal.txt", lines);
}