Entity Framework技能知识点测试2

  • 您正在使用EF Core编写一个博客应用程序,其中包含实体Post(贴子)和Comment(评论)。使用以下查询加载帖子。之后,如何显式加载Comment?

  • 相关资源:https://www.cnblogs.com/jaxu/p/3700511.html

 

  • 您正在构建一个包含几个子域的应用程序,每个子域都有自己的DbContext。如何编写一个集成不同子域的快速测试?

相关资源:https://www.cnblogs.com/Laimic/p/9172844.html(EntityFrameworkCore - 内存数据库)

 

 

  • 如果要在ChangeTracker中将实体的状态更改为“已更改”,应执行以下哪项操作?

在使用EF框架时,我们通常都是通过调用SaveChanges方法把增加/修改/删除的数据提交到数据库,但是上下文是如何知道实体对象是增加、修改还是删除呢?答案是通过EntityState的枚举值来判断的。也就是说在操作数据库时,EF会根据EntityState这个枚举检测到实体的状态,然后执行相应的增/删/改操作。

该状态对应的值为以下五种:

Detached:对象存在,但未由对象服务跟踪。在创建实体之后、但将其添加到对象上下文之前,该实体处于此状态;
Unchanged:自对象加载到上下文中后,或自上次调用 System.Data.Objects.ObjectContext.SaveChanges() 方法后,此对象尚未经过修改;
Added:对象已添加到对象上下文,但尚未调用 System.Data.Objects.ObjectContext.SaveChanges() 方法;
Deleted:使用 System.Data.Objects.ObjectContext.DeleteObject(System.Object) 方法从对象上下文中删除了对象;
Modified:对象已更改,但尚未调用 System.Data.Objects.ObjectContext.SaveChanges() 方法。

  • Nopcommerce中 _context.SaveChanges()保存到数据库时遇到错误时引发的异常(EF Core)

  • DbUpdateException:保存到数据库时遇到错误时引发的异常
  • 通过dbContext.ChangeTracker.Entries()跟踪得到上下文中的实体
  • 回滚实体更改并返回完整的错误消息,并将异常抛出
public virtual void Insert(IEnumerable<TEntity> entities)
        {
            if (entities == null)
                throw new ArgumentNullException(nameof(entities));

            try
            {
                Entities.AddRange(entities);
                _context.SaveChanges();
            }
            catch (DbUpdateException exception)
            {
                //ensure that the detailed error text is saved in the Log
                throw new Exception(GetFullErrorTextAndRollbackEntityChanges(exception), exception);
            }
        }
/// <summary>
        /// 回滚实体更改并返回完整的错误消息
        /// </summary>
        /// <param name="exception">Exception</param>
        /// <returns>Error message</returns>
        protected string GetFullErrorTextAndRollbackEntityChanges(DbUpdateException exception)
        {
            //rollback entity changes
            if (_context is DbContext dbContext)
            {
                var entries = dbContext.ChangeTracker.Entries()
                    .Where(e => e.State == EntityState.Added || e.State == EntityState.Modified).ToList();

                entries.ForEach(entry =>
                {
                    try
                    {
                        entry.State = EntityState.Unchanged;
                    }
                    catch (InvalidOperationException)
                    {
                        // ignored
                    }
                });
            }
            
            try
            {
                _context.SaveChanges();
                return exception.ToString();
            }
            catch (Exception ex)
            {
                //if after the rollback of changes the context is still not saving,
                //return the full text of the exception that occurred when saving
                return ex.ToString(); 
            }
        }
  • 如何创建名为InitialCreate的新迁移?

通过add-migration InitialCreate命令

 

    •  最不可能导致异常的方法是FirstOrDefault?

1.SingleOrDefault和FirstOrDefault的区别

   SingleOrDefault 只取一个 如果没有数据等于 null, 如果>1  异常(只取一个,或者没有,多个则异常)

   FirstOrDefault  只取一个  如果没有数据等于 null, 如果>1 取第一个(只取一个,或者没有,不会异常)

2.First和FirstOrDefault的区别

   First:取序列中满足条件的第一个元素,如果没有元素满足条件,则抛出异常(只取一个,没有则异常)
   FirstOrDefault:取序列中满足条件的第一个元素,如果没有元素满足条件,则返回默认值(对于可以为null的对象,默认值为null,对于不能为null的对象,如int,默认值为0)

 

  • 您将调用哪个方法来跟踪一个实体以及通过该实体的导航属性可以访问的所有实体?

DbContext.ChangeTracker.TrackGraph: Added

TrackGraph 是 EF Core 中的一个全新概念。它为想要用 DbContext 开始跟踪的对象图形中的每个对象提供最大限度的控制。

TrackGraph 遍历图形(也就是说,它遍历图形中的每个对象)并将指定的函数应用到每个对象。该函数是 TrackGraph 方法的第二个参数。

最常见的例子是将每个对象的状态设置为通用状态。在下面的代码中,TrackGraph 将遍历 newSword 图形中的所有对象,并将其状态设置为 Added:

context.ChangeTracker.TrackGraph(newSword, e => e.Entry.State = EntityState.Added);

  参考资源:https://docs.microsoft.com/zh-cn/archive/msdn-magazine/2016/august/data-points-ef-core-change-tracking-behavior-unchanged-modified-and-added

 

  • 如何EF Core中以异步方式将更改保留到数据库?

  await context.SaveChangesAsync();

 

  • EF中 如何批量添加插入数据

  • 禁用:ctx.Configuration.AutoDetectChangesEnabled = false;
  • 使用BulkInsert或者
  • contex.BulkInsert(list);
    contex.BulkSaveChanges();

    或者使用AddRange()

  • ctx.Orders.AddRange(orderList);
    ctx.SaveChanges();
  •  执行Migrate()命令的典型用例是什么?

  • 开发期间,数据模型将发生更改并与数据库不同步。 可以删除该数据库,让 EF 创建一个新的数据库来匹配该模型,但此过程会导致数据丢失。 EF Core 中的迁移功能能够以递增方式更新数据库架构,使其与应用程序的数据模型保持同步,同时保留数据库中的现有数据。
  • 相关资源:
  • https://docs.microsoft.com/zh-cn/ef/core/managing-schemas/migrations/index?tabs=dotnet-core-cli#apply-migrations-at-runtime
  • https://www.cnblogs.com/amytal/p/11686180.html

 

 

  • Add (添加)和Attach(附加)有什么区别?

  • 相关资源:https://www.cnblogs.com/Jnw-qianxi/p/3260989.html
  • 当SavaChanged()方法执行期间,他会查看当前Entity的EntityState的值,决定是去新增(Added)、修改(Modified)、删除(Deleted)、什么也不做(UnChanged)。   

  • DbContext类的Add()方法的作用就是将一个Entity的State修改为Added,这样在SavaChanged()方法就会将实体新增到数据库当中。

  • 而Attach在 微软的中文翻译中是附加,不同于Add方法的添加,她是将一个处于Detached的Entity附加到上下文,而附加到上下文后的这一Entity的State为UnChanged,所以在下面的代码中,需要将obj的State修改为Modified

 

  • EF 解除属性映射到数据库中 NotMappedAttribute无效解决办法

  • 相关资源:https://www.cnblogs.com/kennyliu/p/5396937.html
  • 可以通过NotMappedAttribute标记模型某个属性可以使该属性不必映射到数据库。
  • public class Unicorn
    {
    public int Id { get; set; }
    [NotMapped]
    public string Name { get; set; }
    
    [Timestamp]
    public byte[] Version { get; set; }
    
    public int PrincessId { get; set; } // FK for Princess reference
    public virtual Princess Princess { get; set; }
    }

    NotMapped无效的时候,在DbContext的OnModelCreating方法重载中实现

  • protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
    //不映射到数据库中
    modelBuilder.Entity<BlogArticle>().Ignore(p => p.Title); 
    }

 

  • 在添加迁移add-migration之前必须做什么?

这些都是EF的命令, 就像 在cmd窗口输入ping 123.123...这样的命令
enable-migration 是开启数据库迁移的命令

add-migration 新增一个迁移项, 比如你新加一个类, 同时生成对应的表UserInfo:

[Table("UserInfo")]
public class 用户
{
一堆的属性
}
迁移命令就是 add-migration 用户add, 这个命令执行完之后会 生成一个迁移文件(可修改),
然后执行命令update-database, 这个命令会根据迁移文件生成对应的表.

当然了, 新建类之后, 在update-database之前, 记得要把这个类在对应的DataContext中引用
更改类的属性的命令是 add-migration 用户change, 然后update-database

删除类的命令是 add-migration 用户delete, 然后update-database

原文地址:https://www.cnblogs.com/gougou1981/p/12228714.html