【发布时间】: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