【发布时间】:2019-12-15 13:01:59
【问题描述】:
所以我试图在 WCF 项目中利用 EF 和我现有的数据库,以便将一些实体添加到数据库中。
设置:
所以我的解决方案有几个层次。
- 核心(类库)
- 数据(类库)
- 服务(类库)
- WCFServices(WCF 应用程序)
- WebUI(MVC 项目)
Entity framework 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 将我的服务项目中的依赖项注入到控制器中,它还将 dbContext(存储在我的数据项目中)注入一些通用存储库(也存储在我的数据项目中),这些存储库在我的服务类库中使用项目。
我的 WCF 项目不以任何方式使用 ninject,我直接引用 dbcontext,因为该服务非常简单,不需要所有这些。所以我也可以看到这是可能的问题?
【问题讨论】:
-
不要使用 LocalDb。如果您从 SQL Server Management Studio 进入本地数据库,您将看到从那里引用。所以当你附加一个新的 LocalDb 时,你会得到错误,因为它已经附加了。我知道,这很令人困惑,但我遇到了同样的错误。解决方案是使用 Sql Lite 或任何真正可移植的东西。
标签: c# asp.net-mvc database entity-framework wcf