因此,我试图在WCF项目中利用EF和我现有的数据库,以便向数据库中添加一些实体。
设置:
所以我的解决方案有几层。
实体框架6.2.0安装在我的Data,WCFServices和WebUI项目中。 (下图)。
因此,我的数据库模型存储在核心项目中,而我对数据库的迁移存储在数据项目中。我的Web UI项目在访问数据库和使用它时没有问题。我在MVC项目和WCF项目中都存储了完全相同的连接字符串。
MVC web.config连接字符串
<add name="DefaultConnection" connectionString="Data Source=(LocalDb)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\aspnet-SQDCDashboard.WebUI-20190610100239.mdf;user id = exampleUser; password = ExamplePassword;Integrated Security=False" providerName="System.Data.SqlClient" />
WCF项目具有以下连接字符串。
WCF web.config连接字符串
<add name="DefaultConnection" connectionString="Data Source=(LocalDb)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\aspnet-SQDCDashboard.WebUI-20190610100239.mdf;user id = exampleUser; password = ExamplePassword;Integrated Security=False" providerName="System.Data.SqlClient" />
如您所见,它们完全匹配。
WCF服务
public class OrderService : IOrderService
{
public string InsertOrder(OrderDTO order)
{
try
{
using (var context = new DataContext())
{
var productionLine = context.ProductionLines
.Where(x => x.ComputerName == order.ComputerName)
.FirstOrDefault();
if (productionLine == null)
throw new Exception("Production line could not be determined from computer name");
context.Orders.Add(new Core.Models.Order
{
MaterialNumber = order.MaterialNumber,
SerialNumber = order.SerialNumber,
ProductionNumber = order.ProductionNumber,
SalesNumber = order.SalesNumber,
OrderComplete = false,
ProductionLineId = productionLine.Id
});
context.SaveChanges();
return "Success";
}
}
catch (Exception ex)
{
return ex.Message;
}
}
}
错误
所以这就是问题所在。当我运行WCF测试客户端来测试我的服务时,它会引发以下错误:
无法创建文件'C:\ Users \ eric_obermuller \ Source \ Repos \ SQDC仪表板\ SQDCDashboard \ SQDCDashboard.WCFServices \ App_Data \ aspnet-SQDCDashash.WebUI-20190610100239.mdf',因为该文件已经存在。更改文件路径或文件名,然后重试该操作。 CREATE DATABASE失败。列出的某些文件名无法创建。检查相关错误。
这真的使我感到困惑,因为数据库已经存在。为什么要尝试创建一个新的?在单个解决方案中构造多个项目时,我还是一个初学者。所以可能是我不了解EF如何在项目之间进行交互?
我确实注意到WCF项目和MVC项目在各自的App_Data文件夹中都有自己的数据库文件。我不得不说我不确定EF如何将这些文件与实际的本地db结合使用,它始终使我感到困惑,因此我可能在这里丢失了一些东西(见下文)。
我尝试过的事情
最后的话
同样,我在实际的MVC Web UI项目中使用数据库时遇到0个问题。我的MVC项目确实使用ninject将依赖项从我的Service项目注入到控制器中,还将dbContext(存储在我的数据项目中)注入到一些通用存储库(也存储在我的数据项目中),这些类库在我的Services类库中使用项目。
我的WCF项目不以任何方式使用ninject,我直接引用了dbcontext,因为该服务是非常简单的服务,不需要所有这些。所以我还可以看到这是可能的问题?
答案 0 :(得分:0)
您为数据库迁移设置了哪个DatabaseInitializer?如果您使用的是“ DropCreateDatabaseAlways”初始化程序,并且对于两个并行运行的应用程序具有相同的数据库,则可能是造成问题的原因。 虽然您的MVC应用程序运行良好,但是WCF在启动DBContext时将失败,因为它将尝试删除并重新创建数据库。 将您的数据库initializers更改为适合这种情况的数据库。 “ DropAndRecreateAlways / ModelChange”不是最佳选择。