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

Posted

技术标签:

【中文标题】WCF 项目尝试在数据库已经存在时重新创建数据库【英文标题】:WCF project trying to recreate database when it exists already 【发布时间】: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 或任何真正可移植的东西。 【参考方案1】:

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

【讨论】:

感谢您的回复。明天我回去工作时会试试这个。我正在使用默认的初始化程序。 所以我不确定发生了什么。但是我没有更改任何内容,我删除了数据库并重新运行了迁移,一切正常(排序)。现在我有两个数据库,WCF 项目从一个中提取,MVC 项目从另一个中提取。这本质上使我意识到如果我将连接字符串名称命名为与我的数据库上下文实现类名称相同,它将使用单个数据库实现。我不确定之前发生了什么,但感谢您的建议!如果你能改变你的答案以某种方式解释为什么我所做的工作我很乐意奖励你积分!

以上是关于WCF 项目尝试在数据库已经存在时重新创建数据库的主要内容,如果未能解决你的问题,请参考以下文章

Django使用Mysql已存在数据表的方法

Django使用Mysql数据库已经存在的数据表方法

CodeIgniter:检查记录是不是存在

保存在 WCF 服务中创建的列表,以便在服务重新启动时查看它

WCF 服务代理生命周期的最佳实践?

尝试分析应用程序时重新定义失败,出现错误 62