我有一个包含大约16,500个城市的表的数据库,以及该数据库的EF数据模型(数据库优先).我用代码将它们预加载到内存中:
Db.Cities.Load()
Run Code Online (Sandbox Code Playgroud)
...然后在使用它们的时候,我尝试了以下每个查询:
Dim cities() As String = Db.Cities.Select(Function(c) c.CityName).ToArray
Dim cities() As String = Db.Cities.Local.Select(Function(c) c.CityName).ToArray
Run Code Online (Sandbox Code Playgroud)
第一个查询是快速的(约10毫秒),但是第二个查询第一次运行大约需要2.3秒(尽管它比第一个查询在此之后调用时更快).
这没有意义,因为SQL Server Profiler验证第一个查询是在另一台机器上命中数据库,但第二个查询不是!
我试过关掉Db.Configuration.AutoDetectChangesEnabled,我试过预先生成视图.
我能做些什么来.Local加快速度?(并非所有运行此应用程序的客户端都将位于快速LAN上.)
.net vb.net entity-framework entity-framework-5 entity-framework-4.3.1
我正在使用针对SQL Server 2012数据库的DbContext POCO方法实体框架4.3.1.
我在数据库中只有两个表,它们看起来像这样:

注意:根本没有在数据库中指定外键 - 我只是在模型中强制执行关系(我无法更改数据库).
它们每个都有一行数据,如下所示:

我执行了以下查询以确保连接可以工作:

现在,我有以下实体:
public class Two
{
public long TwoId { get; set; }
public string OneId { get; set; }
public virtual One One { get; set; }
}
public class One
{
public string OneId { get; set; }
public DateTime DeliveryDate { get; set; }
public virtual ICollection<Two> Twos { get; private set; }
public void AddTwo(Two two)
{
if (two == null)
throw new ArgumentNullException("two");
if (Twos == …Run Code Online (Sandbox Code Playgroud) c# navigation-properties ef-code-first sql-server-2012 entity-framework-4.3.1
我正在使用MVC3,Entity Framework v4.3 Code First和SimpleInjector.我有几个简单的类看起来像这样:
public class SomeThing
{
public int Id { get; set; }
public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我有另一个看起来像这样的实体:
public class MainClass
{
public int Id { get; set; }
public string Name { get; set; }
public virtual AThing AThingy { get; set; }
public virtual BThing BThingy { get; set; }
public virtual CThing CThingy { get; set; }
public virtual DThing DThingy { get; set; }
public virtual EThing EThingy { …Run Code Online (Sandbox Code Playgroud) dependency-injection asp.net-mvc-3 simple-injector entity-framework-4.3.1
在Entity Framework 4.3.1中,我有以下模型,它们工作正常:
public class BaseUser
{
[Key]
[MaxLength(100)]
public string Username { get; set; }
}
[Table("AppUser")] // Ensures EF Code First uses Table-per-Type
public class AppUser : BaseUser
{
[MaxLength(200)]
public string About { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
升级到EF 5.0后,当我尝试运行此应用程序并访问关联的DbContext时,我收到以下异常:
EntityType 'AppUser' has no key defined. Define the key for this EntityType.
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个问题?这似乎是一种回归.
我从Entity Framework 4.3.1获得此异常(顺便从Visual Studio 2010中针对.NET 4构建的ASP .NET MVC 3 Web应用程序):
System.InvalidOperationException:已成功提交对数据库的更改,但更新对象上下文时发生错误.ObjectContext可能处于不一致状态.内部异常消息:无法将对象添加到对象上下文.对象的EntityKey具有ObjectStateEntry,指示对象已经参与了不同的关系.
我做了一些谷歌搜索,我来到了这里(在msdn上):
保存时出现InvalidOperationException
在Jeff Derstadt(接受的答案)中说:
然后,当您调用SaveChanges时,上下文会保留更改,然后尝试修复状态条目.当它执行此操作时,它执行"密钥修正",其中将临时EntityKeys转换为完整的EntityKeys.在这种情况下,临时密钥TKP2现在将等于P2的密钥.上下文尝试将状态管理器中的密钥条目"提升"为完整的实体条目,并在此过程中修复图形.这是因为存在冲突而发生异常的地方:P1.Spouse = P2,因此P2.Spouse应该= P1,但是因为添加了项目,所以P2.Spouse已经等于P3而且EntityReference不能有多个值.不幸的是,在数据库保存发生之前并不总是可以检测到这种情况,因为临时EntityKeys不等同于完整的EntityKeys,所以我们无法识别这样的未来类别.
我在这里想一个"肮脏"的方式,所以我的问题是这个......
因为我真的不在乎保存更改后对象图形是什么样的(这是我的请求结束所以无论如何都被丢弃了)并且数据已被插入(当我在SQL Server中查看它时,它实际上是完全正常的)在我让它继续在调试器中) - 有没有一种方法我可以告诉实体框架不执行此步骤(因此不会得到此异常,并且可能会节省一点时间)?
在使用EFProfiler(绝对精彩的工具BTW!)来分析我们的一些实体框架应用程序之后,似乎在大多数情况下,所有的对象上下文都没有关闭.
例如,在本地运行之后,EF Profiler告诉我已经打开了326个对象上下文,但只有1个已关闭?
所以我的问题是,我应该担心吗?或者它是否在实体框架中自包含?