C# 尝试附加自动命名数据库失败

C# 尝试附加自动命名数据库失败,c#,asp.net-core,entity-framework-core,C#,Asp.net Core,Entity Framework Core,目标 我正在尝试在ASP.NET核心web应用程序和其他项目/解决方案之间共享类库,并且该类应该能够与调用进程/环境正在使用的任何数据库进行交互 问题 我有一个类库,在我的ASP.NET Core 3.1 web应用程序中使用时出现了一个奇怪的错误。类库实际上是在前端(网站)和后端应用程序之间共享的,后端应用程序负责一些重复出现的重载过程。我正在使用前端和后端的EF Core,数据库位于Azure上,而不是我的本地计算机。然而,当web应用程序尝试做一些工作时,我得到了以下错误: 尝试为文件C:

目标
我正在尝试在ASP.NET核心web应用程序和其他项目/解决方案之间共享类库,并且该类应该能够与调用进程/环境正在使用的任何数据库进行交互

问题
我有一个类库,在我的ASP.NET Core 3.1 web应用程序中使用时出现了一个奇怪的错误。类库实际上是在前端(网站)和后端应用程序之间共享的,后端应用程序负责一些重复出现的重载过程。我正在使用前端和后端的EF Core,数据库位于Azure上,而不是我的本地计算机。然而,当web应用程序尝试做一些工作时,我得到了以下错误:

尝试为文件C:…\bin\Debug\netcoreapp3.1\aspnetdb.mdf附加自动命名数据库失败。存在同名数据库,或无法打开指定的文件,或该文件位于UNC共享上

这对我来说毫无意义,因为DB在Azure上。此外,使用后端应用程序在库中调用相同的精确方法不会引发此错误。连接字符串存储在网站的
appsettings.json
和后端的
app.config

这是抛出错误的代码块,但同样,这只发生在ASP.NET核心项目的
SaveChanges()
调用上:

public static void AddLogEvent(int Severity, DateTime EventTime, string EventType, string User, string Message)
{
        DBEntities context = new DBEntities();
        DbSet<LogEvent> dbSet = context.Set<LogEvent>();
        LogEvent NewRecord = new LogEvent();
        NewRecord.Id = Guid.NewGuid();
        NewRecord.Severity = Severity;
        NewRecord.EventTime = EventTime;
        NewRecord.EventType = EventType;
        NewRecord.User = User;
        NewRecord.Message = Message;

        dbSet.Add(NewRecord);

        context.SaveChanges();
}
最后,当我在网站上逐步调试时,我可以看到
ConfigurationManager.connectionString
中唯一的连接字符串是1,名称为
LocalSqlServer
,连接字符串设置为:

data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true

这似乎是我的本地测试
SQLExpress
实例,但没有在web应用程序的任何地方使用。SQLExpress中对本地测试数据库的所有引用或连接字符串都已删除,因此我不清楚这是如何显示的,而appsettings.json中的引用或连接字符串被忽略。我也不明白optionsBuilder.IsConfigured是如何在web应用程序上返回FALSE的。我希望已经配置了该上下文。

最后我将最后一条if语句更改为以下内容:

                if (FoundValidConnection == false)
                {
                    try
                    {
                        //read from appsettings.json directly instead
                        string connString = new ConfigurationBuilder().SetBasePath(System.IO.Directory.GetCurrentDirectory()).AddJsonFile("appsettings.json").Build().GetSection("ConnectionStrings").GetSection("DefaultConnection").Value;
                        optionsBuilder.UseSqlServer(connString);
                        FoundValidConnection = true;
                    }
                    catch (System.Exception ex)
                    {

                    }
                }
正如Ivan在上面的评论中所指出的,
System.Configuration
中的
ConfigurationManager
仅适用于基于XML的
app.config
。ASP.NET核心利用了
appsettings.json
,这显然是基于json的。因此,解决方案是修改最后一个检查,如果
app.config
检查失败,并且没有产生任何结果,那么我们假设代码被使用
appsettings.json
的某个东西调用,并且一行使用
ConfigurationBuilder
获取应用程序的目录,基于该文件构建配置,并通过其节和名称获得预期的连接

SetBasePath()
AddJsonFile()
分别需要引用
Microsoft.Extensions.Configuration.FileExtensions
Microsoft.Extensions.Configuration.Json


如果出现一些不可预见的错误,并且appsettings/json不包含预期的节/名称,则需要try/catch块。尽管如此,如果没有设置任何内容,在尝试与数据库交互时,最终会在某个地方抛出错误。

我最终将最后一条if语句更改为以下内容:

                if (FoundValidConnection == false)
                {
                    try
                    {
                        //read from appsettings.json directly instead
                        string connString = new ConfigurationBuilder().SetBasePath(System.IO.Directory.GetCurrentDirectory()).AddJsonFile("appsettings.json").Build().GetSection("ConnectionStrings").GetSection("DefaultConnection").Value;
                        optionsBuilder.UseSqlServer(connString);
                        FoundValidConnection = true;
                    }
                    catch (System.Exception ex)
                    {

                    }
                }
正如Ivan在上面的评论中所指出的,
System.Configuration
中的
ConfigurationManager
仅适用于基于XML的
app.config
。ASP.NET核心利用了
appsettings.json
,这显然是基于json的。因此,解决方案是修改最后一个检查,如果
app.config
检查失败,并且没有产生任何结果,那么我们假设代码被使用
appsettings.json
的某个东西调用,并且一行使用
ConfigurationBuilder
获取应用程序的目录,基于该文件构建配置,并通过其节和名称获得预期的连接

SetBasePath()
AddJsonFile()
分别需要引用
Microsoft.Extensions.Configuration.FileExtensions
Microsoft.Extensions.Configuration.Json


如果出现一些不可预见的错误,并且appsettings/json不包含预期的节/名称,则需要try/catch块。尽管如此,如果没有设置任何内容,在尝试与数据库交互时,最终会在某个地方抛出错误。

我希望已经配置了该上下文-当您使用无参数构造函数(
=new DBEntities();
)时,从未配置过该上下文。当您使用DI或使用外部配置的带有
DbContextOptions
参数的构造函数时,将对其进行配置。好的,谢谢您提供的信息。这有点帮助,但我不确定这与web应用程序抛出的错误有什么关系,这个错误似乎与一个完全不同的数据库有关,它甚至不应该知道这个数据库是否存在。我不知道为什么web应用的ConfigurationManager.ConnectionString集合只包含我在appsettings.json中没有设置的那个集合。我不知道它是从哪里来的,也不知道它为什么要使用它。这与EF Core无关,你必须弄清楚。首先,什么是
ConfigurationManager
变量,它来自何处以及如何初始化。您似乎正在使用
System.Configuration
中的
ConfigurationManager
,它仅适用于
app.config
文件。对于.Net核心应用程序(
appsettings.json
),您需要一种不同的方法。谢谢你给我指出了正确的方向。我会跟进并提交一个答案,以便在我找到答案后与其他人分享。似乎依赖注入可能是一种方式。我希望