自从EF 4.1上线以来,我就一直在使用EF CodeFirst,那是一年多以前的事了,现在我觉得很适合使用它。我习惯于定制实体验证器,重写.SaveChanges()来修改它的一些行为,以及一些重要的概念,比如映射到非表db对象。但是EF的这一部分对我来说仍然是多云的:context.Configuration.LazyLoadingEnabled = false;。
我了解基本情况,一旦调用linq查询,它们就会被抛到数据库中,如果我没有显式地指定它( yadda yadda yadda ),依赖集合就不会被加载。我想了解的是:
在什么情况下我应该禁用延迟加载?为什么?
禁用它的实
首先,我使用EF6.0和代码优先的方法。我的context配置设置为启用“代理创建”和“延迟加载”。
我的问题是:延迟加载是否适用于返回IEnumerable (而不是IQueryable)的方法的结果?
我认为下面的代码更具有解释性:
public void Test()
{
var company = GetCompanies().FirstOrDefault();
if (company.Employees.Count() > 0)
{
//I got here without errors!
}
}
public IEnumer
问题所在
不确定这样做的正确方式是...我有一个简单的类:
public partial class Event
{
public int Id { get; set; }
public string Description { get; set; }
public int? PreviousEventId { get; set; }
public virtual Event PreviousEvent { get; set; }
}
在我的MVC3项目中,我有一个窗体,用于编辑事件描述和(可选)从下拉列表中选择上一个事件。表单被提交给一个操作,并且像通常的MV
首先,我在EF Code中有两个模型:
public class Book
{
public int Id { get; set; }
public virtual IEnumerable<Page> Pages { get; set; }
}
public class Page
{
public int Id { get; set; }
public int BookId { get; set; }
public Book Book { get; set; }
}
从DB加载Book模型时,Pages属性为Null。但是当替换IEnumerable => ICo
我正在使用MVC.NET网络应用程序接口,EF和DB优先,我已经在我的上下文中关闭了延迟加载。EF返回的数据太多了,即使关闭了LazyLoading。
例如,我的用户只有一个角色。当我查询用户和包含角色时,Role.Users属性会自动填充数据,因为用户已经加载到上下文中。
为什么我不能让EF给我我想要的?还是我错过了什么重要的东西?
public partial class User
{
public int UserID { get; set; }
public string Title { get; set; }
public string Email { get
假设首先使用的是EF6代码。假设我们有一个简单的两表关系。其中一个病人有一个关联的医生。
class Patient
{
[Key]
public int id { get; set; }
public string Name { get; set; }
[ForeignKey("Doctor")]
public int DoctorId { get; set; }
public virtual MedicalPersonel Doctor { get; set; }
}
class MedicalPersonel
{
[Key]
我在我的应用程序中使用了EF5 (代码优先)。我有一个表,其中包含一些惰性加载字段。
public class TestEntity
{
public int Id { get; set; }
public virtual TestEntity2 SubEntity2 { get; set; }
public virtual TestEntity3 SubEntity3 { get; set; }
private ICollection<SubEntity4> _subEntities;
public ICollection<Sub
上的EF核心文档引用了以下示例:
public class Blog
{
private ICollection<Post> _posts;
public Blog()
{
}
private Blog(ILazyLoader lazyLoader)
{
LazyLoader = lazyLoader;
}
private ILazyLoader LazyLoader { get; set; }
public int Id { get; set; }
public string
我首先使用EF数据库,因为我喜欢在中设计我的数据库,坦率地说,让Visual直接从数据库创建所有实体非常容易,而无需执行任何代码。
然而,我在SQL上注意到,每当我在结果集合上调用ToList()时,EF都在急切地加载对象的所有相关实体。
假设我有这样一个实体:
public class SomeEntity
{
public string Name { get; set; }
public IEnumerable<SomeOtherEntity> ListOfOtherEntites { get; set; }
}
然后,我可以进行查询,获取以下实体的列表:
public
我有一个这样的课程
public class Definition
{
public virtual string Name {} ..
public void Validate(string value){}
}
public class Value
{
private string innerValue;
public virtual Definition Definition {}
public string Value
{
get {
return innerValue;
}
set
我正在使用带有自我跟踪实体T4模板的EF4。
当我在entity Page (带有导航属性Category)上执行选择时,如下所示:
var page = (from p in context.Page select p).FirstOrDefault();
导航属性Category始终为空。
当我这样做的时候:
var page = (from p in context.Page.Include("Category") select p).FirstOrDefault();
Category即已加载。
为什么我必须将include函数与硬编码字符串一起使用?当我访问导航属性时
考虑如下定义的Person和Address类
class Person
{
public int PersonId { get; set; }
public virtual Address Address { get; set; }
}
class Address
{
public int PersonId { get; set; }
public virtual Person Person { get; set; }
}
其中只有一些人有地址,但所有地址都有人。这是一个,所以我将它配置为
modelBuilder.Entity<Address>()
.Has
我有一个使用EF5数据库的多层应用程序-- ADO.NET和MVC4,当我尝试加载一些没有EF的属性时,我遇到了一个问题。我是说,我有一个实体A,就像:
A
{
public int id {set; get;}
public string name {set; get;}
public virtual ICollection<B> B { get; set; }
}
所以在某些情况下,我已经从另一个原因加载了B集合,我需要将它分配给A。
就像一个简单的:
a.B = b;
这发生在我的业务逻辑层上,因此dbcontext在很久以前就已经被释放了。
但
我听说过很多关于延迟加载的性能问题,无论是在NHibernate,Linq...
问题出在N+1选择上。例如,我想要所有的帖子和它的用户,在foreach我懒惰加载用户,他们我需要一个帖子的选择,加上每个用户的N选择。
延迟加载:
1- select ....from post
N- select ....from user
“好”的方法是做一个连接:
1- select .....from post inner join user on post.UserId = user.Id
但是看到EF生成SQL,我意识到很多数据都被浪费了。假设所有的帖子都是同一个用户。Inner Join将为每个p
我有一个问题,我想许多专业的开发人员都会遇到这个问题。我的工作场所采用了实体框架。我们用它,也爱它。然而,我们似乎遇到了一个非常令人沮丧的限制。
让我们假设您有这样的对象链
-> B -> C -> D
我们是专业人员,所以这些对象有大量的数据,并且在它们各自的数据库表中有很多数据。似乎EF很难加载任何过去的对象B。它生成的SQL查询效率很低,不太好。这个电话就像是
context.objects.include("bObjectName.cObjectName.dObjectName").FirstOrDefault(x => x.PK == some
首先,我的UoW继承自DbContext。
我转到使用Unity.Mvc3,并将这一行添加到我的注册中:
Container.RegisterType<IUnitOfWork, UnitOfWork>(new HierarchicalLifetimeManager());
一旦我转到这里,我对实体框架的惰性加载似乎停止了工作。下面是一个示例:
public class Process
{
public Guid Id {get;set;}
public virtual Guid? StatusId {get;set;} //this is the FK EF u