【问题标题】:0 results on query even though rows exist in Database = 2 databases, but why 2?尽管数据库中存在行 = 2 个数据库,但查询结果为 0,但为什么是 2 个?
【发布时间】:2012-05-04 20:21:03
【问题描述】:

我使用的是实体框架 (4.3) 和代码优先(连同 SQL server 2012 localdb)。

我遇到了一个有趣的情况,在一个应用程序中,一个调用返回一个结果('card'),而另一个在同一个数据库上使用相同的查询(有数千行可用)什么都不返回(在这种情况下为 null,因为我'正在使用 FirstOrDefault)。

using (var context = new MyEntities())
        {
            //verify account exists
            var account = context.Account.SingleOrDefault(a => a.AccountNum == accountNum);

            if (account == null)
            {   
                //handle no account                 
                return false;
            }                

            var card = context.cards.FirstOrDefault(c => c.Used == false);

            //check that we actually got a card
            if (card == null)
            { 
                //handle no cards available
                return false;
            }

            card.Used = true;

           //snip...

            context.SaveChanges();
        }

在我的测试控制台应用程序中,“卡片”将有一个值,而在我的“服务”中则没有。相同的代码(甚至相同的程序集),相同的数据库,相同的行可用。帐户检索在这两种情况下都有效。

我要试试这个: How to force EF Code First to query the database?

但即使这样可行,不一致的行为对我来说也没有意义。

编辑

最后我有两个数据库实例,正如指出的那样。有趣的部分是数据源的变化取决于库的运行位置(作为 VS11 下的调试或作为管理员用户运行的服务)。这是我的 app.config:

<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework">
  <parameters>
    <parameter value="Data Source=(localdb)\v11.0; Integrated Security=True; MultipleActiveResultSets=True" />
  </parameters>
</defaultConnectionFactory>

当我附加到运行与控制台应用程序相同的库 (DLL) 的服务进程时,数据源已更改:

(localdb)\v11.0

收件人:

.\SQLEXPRESS

相同的 DLL,相同的 app.config。我隐约记得读过一些关于命名与未命名的本地数据库实例以及它们在什么用户下运行的内容,但是我的谷歌技能目前让我失望。

因此,当我在 SSMS 中打开连接时,我需要使用适当的服务器名称,具体取决于我正在使用的数据库。没什么大不了的,因为这只是开发的设置。

我的问题:

  • 有人知道记录在哪里吗?

【问题讨论】:

  • 确保您使用的是同一个数据库。对我来说,它看起来像不返回任何内容的应用程序创建了它正在使用的自己的数据库。数据库为空,因此您看不到任何结果。
  • 这是唯一的数据库。正如我所说,帐户请求在这两种情况下都有效(所以我必须在同一个数据库上)。如果数据库为空,我将无法获取数据库中存在的帐户。
  • 请显示应用程序和服务的连接字符串。我敢打赌,其中至少有一个正在使用User Instances 和/或AttachDbFileName。在这种情况下,您将连接到同一数据库的两个不同副本。
  • 你说的都是对的。当我在两个数据库中创建相同的帐户时,我被这些帐户抛弃了。它们在不同的用户下运行,因此最终成为不同的数据库(第一次使用 localdb)。有点尴尬:$。

标签: sql-server entity-framework ef-code-first


【解决方案1】:

问题在于使用了两个数据库。使用了两个,因为我在实际运行的文件夹中没有 .config 与我的服务的连接字符串。测试应用程序有一个带有

的.config
  <entityFramework>
  <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework">
        <parameters>
             <parameter value="Data Source=(localdb)\v11.0; Integrated Security=True; MultipleActiveResultSets=True" />
        </parameters>
  </defaultConnectionFactory>
  </entityFramework>

服务没有,因此采用默认行为(似乎是连接到 SQL Server 的默认实例)。

我宁愿让应用程序在没有明确说明连接的情况下无法创建数据库(引发异常),但是 Microsoft 在DbContext 的“备注”部分对此进行了记录:

如果未找到连接字符串,则将该名称传递给在 Database 类上注册的 DefaultConnectionFactory。然后,连接工厂使用上下文名称作为默认连接字符串中的数据库名称。 (除非注册了不同的 DefaultConnectionFactory,否则此默认连接字符串指向本地计算机上的 .\SQLEXPRESS。)

【讨论】:

    猜你喜欢
    • 2014-05-02
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 2020-11-20
    • 1970-01-01
    • 2020-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多