在c# Windows窗体应用程序中使用MVC项目中的DbContext

本文关键字:MVC 项目 DbContext Windows 窗体 应用程序 | 更新日期: 2023-09-27 18:12:01

我的解决方案中有两个项目。第一个是名为EXSIS的MVC项目,第二个是名为Backend的c# Windows窗体应用程序。EXSIS包含数据库文件exsisDB。MDF和使用数据库第一方法构建。现在我想要能够做的是访问后台中的EXSIS的DbContext(称为exsisDBEntities),以便每天在特定时间向我的数据库添加记录。我已经添加了EXSIS作为后端引用。

下面是Form1在后台的代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.Entity;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using EXSIS.Models;
namespace Backend
{
    public partial class Form1 : Form
    {
    exsisDBEntities db = new exsisDBEntities();
    public Form1()
    {
        InitializeComponent();
    }
    private void Form1_Load_1(object sender, EventArgs e)
    {
        System.Threading.TimerCallback callback = new System.Threading.TimerCallback(ProcessTimerEvent);
        var dt = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 1, 0, 0);
        if (DateTime.Now < dt)
        {
            var timer = new System.Threading.Timer(callback, null, dt - DateTime.Now, TimeSpan.FromHours(24));
        }
    }
    private void ProcessTimerEvent(object obj)
    {
        LastOrder();
    }
    private void LastOrder()
    {
        List<Customer> customers = new List<Customer>();
        customers = db.Customers.ToList();
        foreach (Customer customer in db.Customers)
        {
            DateTime LastOrderDate = Convert.ToDateTime(customer.Transactions.Last().Date);
            TimeSpan TimeSinceLastOrder = DateTime.Now - LastOrderDate;
            if (TimeSinceLastOrder.TotalDays > 30)
            {
                Notification n = new Notification();
                n.NotificationID = db.Notifications.Last().NotificationID + 1;
                n.DateGenerated = DateTime.Now;
                n.NotificationType = "Last Order";
                n.CustID = customer.CustID;
                NotificationLink nl = new NotificationLink();
                nl.NotificationLinkID = db.NotificationLinks.Last().NotificationLinkID + 1;
                nl.NotificationID = n.NotificationID;
                nl.RepID = customer.RepID;
                db.Notifications.Add(n);
                db.NotificationLinks.Add(nl);
            }
        }
        db.SaveChanges();
    }
}
}

当我运行这个时,我最初得到一个错误说:

在应用程序配置文件中找不到名为'exsisDBEntities'的连接字符串。

所以我上网了。并将以下连接字符串复制到后台的app.config文件中:

<connectionStrings>
<add name="exsisDBEntities" connectionString="metadata=res://*/Models.EXSISModel.csdl|res://*/Models.EXSISModel.ssdl|res://*/Models.EXSISModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=(LocalDB)'v11.0;attachdbfilename=|DataDirectory|'exsisDB.mdf;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
</connectionStrings>

但是这给了我一个新的错误。当LastOrder()方法中的以下行运行时:

customers = db.Customers.ToList();

我得到错误信息:

类型为"System.Data.Entity.Core"的未处理异常。EntityException'在EntityFramework.SqlServer.dll中发生

附加信息:打开基础提供程序失败。

如果您能帮助解决这个错误,我将不胜感激。

在c# Windows窗体应用程序中使用MVC项目中的DbContext

你漏掉了*。从其他项目获取Edmx文件。metadata=res://...连接字符串是对edmx文件和数据库的引用。在数据库优先的生成上下文中,这两个都是必需的。

然而,正如@TroyCarlson所指出的,您最好将所有这些移到两个项目都可以引用的类库中。

我也有同样的问题,但是我还不能解决它,但是"using"可能是有用的:

using(exsisDBEntities db = new exsisDBEntities())
{
     //your code
}