WCF项目尝试在数据库已经存在时重新创建

时间:2019-08-07 20:43:01

标签: c# asp.net-mvc database entity-framework wcf

因此,我试图在WCF项目中利用EF和我现有的数据库,以便向数据库中添加一些实体。

设置:

所以我的解决方案有几层。

  • 核心(类库)
  • 数据(类库)
  • 服务(类库)
  • WCFServices(WCF应用程序)
  • WebUI(MVC项目)

实体框架6.2.0安装在我的Data,WCFServices和WebUI项目中。 (下图)。

enter image description here

因此,我的数据库模型存储在核心项目中,而我对数据库的迁移存储在数据项目中。我的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结合使用,它始终使我感到困惑,因此我可能在这里丢失了一些东西(见下文)。

enter image description here

我尝试过的事情

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

最后的话

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

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

1 个答案:

答案 0 :(得分:0)

您为数据库迁移设置了哪个DatabaseInitializer?如果您使用的是“ DropCreateDatabaseAlways”初始化程序,并且对于两个并行运行的应用程序具有相同的数据库,则可能是造成问题的原因。 虽然您的MVC应用程序运行良好,但是WCF在启动DBContext时将失败,因为它将尝试删除并重新创建数据库。 将您的数据库initializers更改为适合这种情况的数据库。 “ DropAndRecreateAlways / ModelChange”不是最佳选择。