c# - Entity Framework 急切加载和延迟加载

标签 c# entity-framework entity-framework-6 lazy-loading eager-loading

试图找出 Entity Framework 中延迟加载和预加载之间的区别。假设我有以下型号:

public interface IBaseEntityObject 
{
    public int Id {get; set;}
}


public abstract class BaseEntityObject : IBaseEntityObject
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id {get; set;}
}


public class Folder : BaseEntityObject
{   
    [DataMember]
    public string Name {get; set;}

    [DataMember]
    public virtual List<Letter> Letters {get; set;} 
}


public abstract class Letter : BaseEntityObject
{   
    [DataMember]
    public string Title {get; set;}

    [DataMember]
    public string Content {get; set;}

    public virtual Folder Folder {get; set;}

    [DataMember]
    public int FolderId {get; set;}

    [DataMember]
    public DateTime CreationDate {get; set;}
}

public class OutgoingLetter : Letter
{
    // .. OutgoingLetter properties
}

public class ReceviedLetter : Letter
{
    // .. ReceviedLetter properties
}


public class MyDbContext : DbContext
{
    public DbSet<Folder> Folders {get; set;}

    public DbSet<Letter> Letters {get; set;}


    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        // Folder <-> Letters       
        modelBuilder.Entity<Letter>()
        .HasRequired(t => t.Folder)
        .WithMany(f => f.Letters)
        .HasForeignKey(t => t.FolderId)
        .WillCascadeOnDelete(true);
    }
}

每当我从数据库中请求一个文件夹时,它的主要目的是访问其中的字母。因此,如果我已经从头开始加载它,而不是在访问字母属性时进行另一个数据库调用,那会是最好的选择吗?我说得对吗?

我读到,禁用延迟加载是通过在构造函数中将 EnableLazyLoading 属性设置为 false 并从字母列表中删除虚拟关键字来配置它来完成的。

如果我每次请求文件夹时都使用 Include(x => x.Lettters) 并保持延迟加载启用,会有什么区别?启用延迟加载时,include 无法使用?

此外,Letter 模型中保存的Folder 属性与延迟加载之间有什么关系吗?我在索要信件时不使用文件夹,但我见过的大多数模型都包含一对多关系中的 Father 属性,我不太明白为什么。

谢谢!

最佳答案

Whenever I ask a folder from the data base, it's main purpose is for accessing the Letters in it.. Therefore, will it be best if I already load it from the beginning instead of making another database call when accessing the Letters property am I correct?

是的,正确。

I've read that disabling the Lazy load is done by configuring it in the ctor with by setting the EnableLazyLoading property to false and removing virtual key word from the letters list.

如果您不想延迟加载某个属性,请删除 virtual 关键字。如果您有时需要有时不需要,请在代码中创建新上下文时禁用延迟加载。

What would be the difference if I just use Include(x => x.Lettters) whenever I ask for a folder and keep the Lazy loading enabled? Include can not be used when Lazy loading is enabled?

它们对彼此没有影响。如果您不包含这些字母,并且尝试访问该属性,EF 将再次调用 db 来获取它们(延迟加载),如果您包含它们,则它们可用,并且不会对数据库进行额外的调用。

Moreover is there any relation between the Folder property that is held in Letter model to the lazy loading? I don't use the Folder when asking for a letter, yet most models around I've seen contain the Father property in one to many relationship and I don't really understand why.

在大多数示例中,导航属性都是以两种方式定义的,但如果您永远不需要从信件中获取文件夹,那么不在信件模型中定义该属性是非常有意义的。

关于c# - Entity Framework 急切加载和延迟加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35505643/

相关文章:

database - 使用 OR-Mapper 有意义吗?

c# - 用于使用 Entity Framework 存储许多实体(使用双外键)的地址的单个地址表

entity-framework - 根据某些条件与另一个表连接后设置 IQueryable<T> 中的属性值

c# - 用于打印条码标签的 Zebra Printer C# 代码

c# - 等待一个或多个任务达到某个里程碑,即异步/等待方式

c# - Razor 语法 PHP 等价物

c# - JsonSerializerSettings 更改属性名称的大小写但不更改属性的属性名称

c# - 如何使用 DbContext 和 SetInitializer 修复 datetime2 超出范围的转换错误?

c# - 过程或函数 SpAddDepartment 指定的参数过多

c# - 将 Microsoft.AspNet.Identity.EntityFramework.3.0.0-rc1-final 安装到类库中