首页 > 解决方案 > WCF 项目尝试在数据库已经存在时重新创建数据库

问题描述

所以我试图在 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 Dashboard\SQDCDashboard\SQDCDashboard.WCFServices\App_Data\aspnet-SQDCDashboard.WebUI-20190610100239.mdf”,因为它已经存在。更改文件路径或文件名,然后重试该操作。创建数据库失败。无法创建列出的某些文件名。检查相关错误。

这真的让我很困惑,因为数据库已经存在。为什么它试图创造一个新的?当谈到在一个解决方案中构建多个项目时,我有点初学者。所以可能我只是不明白 EF 如何在项目之间进行交互?

我确实注意到我的 WCF 项目和我的 MVC 项目在各自的 App_Data 文件夹中都有自己的数据库文件。我不得不说我不确定 EF 如何将这些文件与实际的本地数据库结合使用,它总是让我感到困惑,所以我可能在这里遗漏了一些东西(见下文)。

在此处输入图像描述

我试过的

  1. 最初我使用的是 Windows 身份验证,但尝试切换到 SQL Server 身份验证(这是我稍后将使用的)。
  2. 我尝试删除项目中的迁移文件夹并删除了数据库迁移表。我重新启用了迁移,添加了一个空迁移,并更新了数据库。
  3. 我三重检查了我引用的 SQL Server 帐户是否具有对数据库的读/写权限。

最后的话

同样,在我的实际 MVC Web UI 项目中使用数据库时,我遇到了 0 个问题。我的 MVC 项目确实使用 ninject 将我的 Service 项目中的依赖项注入到控制器中,它还将 dbContext(存储在我的数据项目中)注入一些通用存储库(也存储在我的数据项目中),这些存储库在我的 Services 类库中使用项目。

我的 WCF 项目不以任何方式使用 ninject,我直接引用 dbcontext,因为该服务非常简单,不需要所有这些。所以我也可以看到这是可能的问题?

标签: c#asp.net-mvcdatabaseentity-frameworkwcf

解决方案


您为数据库迁移设置了哪个 DatabaseInitializer?如果您正在使用“ DropCreateDatabaseAlways ”初始化程序并且为两个并行运行的应用程序具有相同的数据库,那么这可能会导致问题。虽然您的 MVC 应用程序运行良好,但 WCF 在启动 DBContext 时会失败,因为它会尝试删除并重新创建数据库。将您的数据库初始化程序更改为适合此场景的初始化程序。“DropAndRecreateAlways/ModelChange”不是最佳候选者。


推荐阅读