0

我首先使用实体​​框架(4.3)和代码(以及 SQL server 2012 localdb)。

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

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

我的问题:

  • 有谁知道这是记录在哪里?
4

1 回答 1

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。)

于 2012-05-30T21:50:20.787 回答