• Entity Framework技能知识点


    dbContext.ChangeTracker(实体对象变动跟踪)

    相关资源:

    context.ChangeTracker.StateChanged += (obj, e) => { if (e.NewState == EntityState.Modified) Debugger.Break(); };

    DbContext.ChangeTracker.StateChanged这个事件会在DbContext中被Track的实体对象的EntityState状态发生变化时被触发,有多少个实体的EntityState状态变化了,它就会被触发多少次

     

     

    •  怎么给EF写个扩展方法或者配置DbContext,充分控制EF呢(DbContextOptionsBuilder)?

    在EF Core 1.0中你可以取代EF使用其内部服务(控制EF调用其内部方法),但这是很复杂的,需要你拿到 EF依赖注入容器的控制权来使用。在1.1中,这个要简单得多。在配置上下文时候使用ReplaceService(...) 方法就行了。在 ASP.NET Core 应用程序中,这通常是在Startup.cs 文件中的 OnConfiguring(...) 方法中。

    利用DbContextOptionsBuilder

    提供用于配置Microsoft.EntityFrameworkCore.DbContextOptions的简单API,通常在此对象上定义数据库(和其他扩展)扩展方法 允许将数据库连接(和其他选项)配置为用于上下文

     

     

    NOP示例

     

     

    • 当您用Change跟踪器,调试实体,您发现实体的状态为Added,当你Save时会发生什么?

     

     

    • EF 主键怎么约定?

    • Code First 的核心是约定,这些默认的规则使我们可以用我们自己的类来创建模型。EF框架要求一个类必须有一个键属性。规则约定如果一个属性名为Id或者是类名+Id的形式(如PatientId),这一属性就被自动配置为键。如果无法找到满足这一规则的属性,将会在运行时抛出一个异常告诉你没有找到Key.其他约定包括确定字符串的默认长度,或者默认表结构,以及当类相互继承时如何在数据库内建表等等。

    • EF的三种追踪实体状态变化方式(DBEntityEntry、ChangeTracker、Local)

    https://www.cnblogs.com/yaopengfei/p/7780624.html

     

     

    • EF迁移

    https://www.cnblogs.com/amytal/p/11686180.html(迁移基础知识)

    •  配置与EF Core Fluent API的一对一关系需要哪些方法?

    •  如何使用数据注释在数据库中为POCO实体类中的字符串属性创建不可为空的列?

     

    • 应该调用哪个方法来创建要存储在数据库中的新实体对象?

     

    • 您分析查询性能日志,注意到实体框架生成的查询速度非常慢。假设查询无法在实体框架内轻松修复,您将如何更正性能问题?

    实现一个更有效地查询数据的存储过程,然后使用实体框架调用该存储过程

    • Microsoft.EntityFrameworkCore.SqlServer依赖于以下哪项?

      • Microsoft.EntityFrameworkCore.Relational

    Fluent API的API配置调用HasOne和WithOne方法。这段关系的重要性是什么?

    • HasOne:配置此实体类型具有指向关系中其他类型的单个实例的引用的关系(类型之间的单个引用关系 如:A引用B类型)
    • HasMany:配置此实体类型具有包含关系中其他类型实例的集合的关系(类型之间的多个包含关系 如:A类型包含了一个List<B>的集合)
    • WithOne:将其配置为一对多关系(指定所对应数据表的关系,一对一)
    • WithMany:将其配置为一对一关系(指定所对应数据表的关系,一对多)
    • 说明一下:Has开头的一系列方法代表着实体主题所拥有的属性的约束,比如在modelBuilder.Entity<Destination>().HasMany(d => d.Lodgings).WithOptional(l => l.Destination);例子中,主题是Destination,里面有属性Lodings,HasMany定义了D里面有List的L。WithOption代表的是Lodging里面对于Destination字段的定义是可为空的,这些映射到数据库字段是否可为空有关。

     

     

    • 您正在使用EF Core构建一个ASP.NET应用程序。如何配置控制反转?

    • 用于操作EF模型集合时,出于性能考虑,您将如何更改以下代码以使其显著提高性能?

    相关资源:

    https://www.cnblogs.com/zhaow/articles/9335239.html

    https://blog.csdn.net/iccolor2014/article/details/103908174

    使用:context.ChangeTracker.AutoDetectChangesEnabled = false;将自动跟踪关闭

    如下:用于操作EF模型集合时,出于性能考虑,所以在批量操作的时候需要把自动跟踪关闭完成后在finally(以免上面步骤失败)中将context.ChangeTracker.AutoDetectChangesEnabled 恢复设置为true

     

    • 为什么要使用惰性加载代理来标记导航属性为虚拟

    • 相关资源:
    • http://www.aizhengli.com/entity-framework-5-code-first/107/entity-framework-code-first-jiazaiduixiang.html(预加载多级预加载惰性加载显式加载)
    • https://www.cnblogs.com/xcsn/p/8868207.html(EF的三种数据加载方式)
    • 惰性加载(Lazy Loading)指的是当第一访问导航属性的时候自动从数据库加载相关实体。这种特性是由代理类实现的,代理类派生自实体类,并重写了导航属性。所以我们的实体类的导航属性就必须标记为virtual
    • 预加载(Eager Loading)表示在查询某类实体时一起加载相关实体,这是使用Include方法完成的
    • 多级加载:
    • 显示加载(Explicit Loading)即使关闭了惰性加载,我们仍然可以通过显式调用来延迟加载相关实体,这是通过调用DbEntityEntry上的相关方法做到的

     

    • 为什么必须为内存中的数据库提供程序命名?

      • 对于单个数据库,可以有多个DbContexts。例如,如果数据库包含多个数据库模式,并且希望将其中的每个模式作为单独的自包含区域处理,则会非常有用。

        问题是当您想首先使用代码来创建数据库时-只有应用程序中的单个上下文才能做到这一点。这方面的诀窍通常是包含所有实体的附加上下文,这些实体仅用于数据库创建。您的实际应用程序上下文只包含实体的子集,必须将数据库初始化程序设置为NULL。

        在使用多个上下文类型时,您还会看到其他问题-例如共享实体类型及其从一个上下文传递到另一个上下文,等等。一般来说,它可以使您的设计更加干净,并且将不同的功能区域分离开来,但它在额外的复杂性中也有代价。

      • 相关资源:

  • 相关阅读:
    HTML5 h1多层次样式问题
    spellcheck
    Favicon
    设计模式
    CSS 宽高的计算
    行高计算
    White-space 属性
    简约插件Plug-in for simple
    js类型及其判断
    前端路由
  • 原文地址:https://www.cnblogs.com/gougou1981/p/12218468.html
Copyright © 2020-2023  润新知