c# - WCF 项目尝试在数据库已经存在时重新创建数据库
问题描述
所以我试图在 WCF 项目中利用 EF 和我现有的数据库,以便将一些实体添加到数据库中。
设置:
所以我的解决方案有几个层次。
- 核心(类库)
- 数据(类库)
- 服务(类库)
- WCFServices(WCF 应用程序)
- WebUI(MVC 项目)
实体框架 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 Dashboard\SQDCDashboard\SQDCDashboard.WCFServices\App_Data\aspnet-SQDCDashboard.WebUI-20190610100239.mdf”,因为它已经存在。更改文件路径或文件名,然后重试该操作。创建数据库失败。无法创建列出的某些文件名。检查相关错误。
这真的让我很困惑,因为数据库已经存在。为什么它试图创造一个新的?当谈到在一个解决方案中构建多个项目时,我有点初学者。所以可能我只是不明白 EF 如何在项目之间进行交互?
我确实注意到我的 WCF 项目和我的 MVC 项目在各自的 App_Data 文件夹中都有自己的数据库文件。我不得不说我不确定 EF 如何将这些文件与实际的本地数据库结合使用,它总是让我感到困惑,所以我可能在这里遗漏了一些东西(见下文)。
我试过的
- 最初我使用的是 Windows 身份验证,但尝试切换到 SQL Server 身份验证(这是我稍后将使用的)。
- 我尝试删除项目中的迁移文件夹并删除了数据库迁移表。我重新启用了迁移,添加了一个空迁移,并更新了数据库。
- 我三重检查了我引用的 SQL Server 帐户是否具有对数据库的读/写权限。
最后的话
同样,在我的实际 MVC Web UI 项目中使用数据库时,我遇到了 0 个问题。我的 MVC 项目确实使用 ninject 将我的 Service 项目中的依赖项注入到控制器中,它还将 dbContext(存储在我的数据项目中)注入一些通用存储库(也存储在我的数据项目中),这些存储库在我的 Services 类库中使用项目。
我的 WCF 项目不以任何方式使用 ninject,我直接引用 dbcontext,因为该服务非常简单,不需要所有这些。所以我也可以看到这是可能的问题?
解决方案
您为数据库迁移设置了哪个 DatabaseInitializer?如果您正在使用“ DropCreateDatabaseAlways ”初始化程序并且为两个并行运行的应用程序具有相同的数据库,那么这可能会导致问题。虽然您的 MVC 应用程序运行良好,但 WCF 在启动 DBContext 时会失败,因为它会尝试删除并重新创建数据库。将您的数据库初始化程序更改为适合此场景的初始化程序。“DropAndRecreateAlways/ModelChange”不是最佳候选者。
推荐阅读
- random - 如何从 Julia 的元素列表中随机选择 n 个唯一元素
- python - 如何让不同版本的 Python 包共存
- woocommerce - 是否有一个 wordpress 钩子来捕捉产品图像更新?
- gis - 我无法从其官方网站下载 OSGEO4w 安装程序
- c# - 传送不工作 c# 统一代码(完整的菜鸟)
- c++ - C ++ Hashmap键值对在第二次调用函数后被擦除
- javascript - 我正在尝试使用 Email.js 制作订阅表单和联系表单
- windows - 如何在登录到 Windows openssh 便携版时运行命令
- android - 有没有办法在android studio的布局编辑器中隐藏组件?
- django - Heroku 的双 AWS S3 模型