【问题标题】:Entity Framework code first causes exception on database access实体框架代码首先导致数据库访问异常
【发布时间】:2015-10-27 20:01:46
【问题描述】:

最近开始尝试深入研究实体框架的代码优先方法。我按照各种教程创建了一些数据库表,但它们都没有成功。

现在从头开始大约 3 到 4 次,因为异常变得越来越荒谬。上次在第一次访问时创建了数据库,但由于缺少权限(使用集成安全性 - wat?)而无法在第二次调试会话中连接到数据库。显然 .mdf 被系统进程阻止了,只有在安全模式下重新启动才能让我摆脱它。

无论如何,重新来过。我有一个类库,其中包含数据库模型和用于外部访问的网关类。我有一个控制台项目来测试数据库的创建和访问。 EF通过NuGet安装在类库中,对EntityFramework.SqlServer.dll的引用添加到Console项目中。

两个项目中的连接字符串如下所示:

<connectionStrings>
    <add name="DbConnection"
        connectionString="Data Source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\LanguageCreator.mdf;Initial Catalog=LanguageCreator;Integrated Security=SSPI"
        providerName="System.Data.SqlClient" />
</connectionStrings>

我的上下文类如下所示:

public class LanguageContext : DbContext {
    public LanguageContext() : base("DbConnection") {
        // Have to set the DataDirectory in code because the wrong one gets set from the config.
        AppDomain.CurrentDomain.SetData("DataDirectory", Directory.GetCurrentDirectory());

        Database.SetInitializer(new CreateDatabaseIfNotExists<LanguageContext>());

        public DbSet<Language> Languages { get; set; }
        public DbSet< ... blablabla various other DbSets following, nothing of interest here.
    }

这是我的网关的样子:

public class Gateway {
    public void InitializeDatabase() {
        using (LanguageContext context = new LanguageContext()) {
            context.Database.Initialize(true);

            // I did have a configuration class for migration, which seeds some initial data, which is why I'm trying to read the WordTypes here but I left that thing out this time ... will try to add it later on.
            IEnumerable<WordType> wordTypes = context.WordTypes.AsEnumerable();

            List<Language> languages = context.Languages.ToList();
        }
    }
}

调用看起来像这样:

class Program {
    static void Main(string[] args) {
        Gateway databaseGateway = new Gateway();

        databaseGateway.InitializeDatabase();
    }
}

现在,没有任何特别之处,我在启动调试会话时收到以下错误:

与 SQL Server 建立连接时出现与网络相关或特定于实例的错误。服务器未找到或无法访问。验证实例名称是否正确以及 SQL Server 是否配置为允许远程连接。 (提供者:SQL 网络接口,错误:50 - 发生本地数据库运行时错误。无法创建自动实例。有关错误详细信息,请参阅 Windows 应用程序事件日志。

很遗憾,Windows 应用程序事件日志没有显示该错误的任何详细信息。又或者是我太笨了,找不到……

究竟是什么导致了这个问题,我该如何解决这个问题?我发现的一切都是关于访问外部 SQL Server 的,但我只是希望 EF 在本地创建一个 .mdf 并连接到它。

【问题讨论】:

    标签: database sql-server-ce code-first entity-framework-6.1 mdf


    【解决方案1】:

    总的来说,我对实体框架和数据库非常陌生,但我有一些建议可能有助于缩小问题的范围。

    1. “验证实例名称是否正确以及 SQL Server 是否配置为允许远程连接。”通过使用不同的程序连接到服务器来查看问题是否与服务器有关。如果您在 EF 之外无法连接到它,您可以将 EF 排除为问题。

    2. 如果可以,请忽略连接字符串或任何提及您的 SQL 数据库的内容,并查看 EF 是否会为您生成 LocalDB。 I believe this is the default behaviour of EF. 如果这行得通,我认为这也表明您的 SQL 服务器有一些问题给您带来了麻烦。

    再说一次,我对此很陌生,所以我只是想建议我用我有限的知识尝试解决这个问题的方法。希望对您有所帮助!

    【讨论】:

    • 如前所述,我没有 SQL Server,因此没有与它的连接。该数据库应该是一个本地 .mdf 文件,该文件尚不存在,但应在首次运行时生成。事实并非如此,我想知道为什么。今晚我会尝试你的第二个建议,但我怀疑它会奏效。我将连接字符串的名称传递给 DbContext 的构造函数,所以我假设它会通知它找不到连接字符串。另外我想知道 .mdf 将在哪里创建,因为这是连接字符串中的信息。
    • 不幸的是,我在没有连接字符串的情况下遇到了同样的异常
    【解决方案2】:

    好的,我偶然发现了它。我在控制台项目中通过 NuGet 安装了 EntityFramework,瞧,Visual Studio 在启动调试会话时创建了 .mdf。

    由于卸载 EntityFramework 后它仍然有效,我重新创建了项目并检查了差异。我发现 app.config 中的 EntityFramework 条目仍然存在,所以我将它们复制到新项目中,现在它也可以正常工作了。

    因此,如果您遇到同样的问题,请尝试将这些部分添加到控制台项目(或您用于访问数据库类库的任何项目类型)的 app.config 中:

    <configSections>
      <section name="entityFramework" 
               type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
               requirePermission="false" />
    </configSections>
    <connectionStrings>
      <add name="LanguageCreator.data.LanguageCreatorContext"
           connectionString="Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\MyContext.mdf;Integrated Security=SSPI"
           providerName="System.Data.SqlClient" />
    </connectionStrings>
    <entityFramework>
      <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
        <parameters>
          <parameter value="mssqllocaldb" />
        </parameters>
      </defaultConnectionFactory>
      <providers>
        <provider invariantName="System.Data.SqlClient"
                  type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
      </providers>
    </entityFramework>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多