查询结果为0,即使Database = 2数据库中存在行,但为什么2?

时间:2012-05-04 20:21:04

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

我首先使用Entity Framework(4.3)和代码(以及SQL server 2012 localdb)。

我有一个有趣的情况,在一个应用程序中,一个调用返回一个结果('card')而另一个在同一个db上使用相同的查询(有几千行可用)不返回任何内容(在这种情况下为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();
        }

在我的测试控制台应用中,'card'将有一个值,而在我的“服务”中它没有。相同的代码(相同的程序集),相同的db,可用的相同行。帐户检索在两种情况下都有效。

我打算尝试这个: How to force EF Code First to query the database?

但即使这有效,不一致的行为对我也没有意义。

修改

结束我指出了两个数据库实例。有趣的是,数据源的更改取决于运行库的位置(作为VS11下的调试或作为admin用户运行的服务)。这是我的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中打开连接时,我需要使用适当的服务器名称,具体取决于我正在使用的数据库。没什么大不了的,因为这只是开发的设置。

我的问题:

  • 有谁知道记录在哪里?

1 个答案:

答案 0 :(得分:0)

问题是使用两个数据库。有两个被使用,因为我在实际运行的文件夹中没有.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。)