我的解决方案中有两个项目。第一个是名为EXSIS的MVC项目,第二个是名为Backend的C#Windows窗体应用程序。 EXSIS包含数据库文件exsisDB.mdf,并使用数据库第一种方法构建。现在我想要做的是在Backend中访问EXSIS的DbContext(称为exsisDBEntities),以便在每天的特定时间向我的数据库添加记录。我添加了EXSIS作为Backend的参考。
以下是Backend中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”的连接字符串。
所以我转到EXSIS中的web.config文件,并将以下连接字符串复制到后端的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="data source=(LocalDB)\v11.0;attachdbfilename=|DataDirectory|\exsisDB.mdf;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
</connectionStrings>
但那只是给了我一个新的错误。当LastOrder()方法中的以下行运行时:
customers = db.Customers.ToList();
我收到错误消息:
EntityFramework.SqlServer.dll中出现未处理的“System.Data.Entity.Core.EntityException”类型异常
其他信息:基础提供商在Open上失败。
非常感谢任何有关如何解决此错误的帮助。
答案 0 :(得分:0)
您缺少其他项目的* .edmx文件。 metadata=res://...
连接字符串是对edmx文件和数据库的引用。在数据库优先生成上下文中都需要这两者。
然而,正如@TroyCarlson指出的那样,你最好将所有这些移到一个两个项目都可以引用的类库中。
答案 1 :(得分:0)
我有同样的问题,但我还不能解决,但“使用”可能有用:
using(exsisDBEntities db = new exsisDBEntities())
{
//your code
}