如何避免在 EF Core 中插入后选择插入的实体?

Posted

技术标签:

【中文标题】如何避免在 EF Core 中插入后选择插入的实体?【英文标题】:How to avoid inserted entity to be selected after insert in EF Core? 【发布时间】:2017-12-08 22:34:18 【问题描述】:

我在 Azure DB 上有很多仅用于日志目的的插入,我发现现在大部分 DTU 使用都由该日志记录占用。

数据库的负载不是因为插入本身,而是因为插入之后,而是因为CreationDate字段是数据库正在生成的,EFCore在插入之后选择了它。

为了解决“datetime2”错误转换,我将CreationDate字段定义为entity.Property(e => e.CreationDate).HasColumnType("datetime").HasDefaultValueSql("getdate()");

所以EF在插入后调用DB:

(@p0 uniqueidentifier)SELECT [CreationDate]
FROM [MyLogs]
WHERE @@ROWCOUNT = 1 AND [Id] = @p0

有没有办法避免这种行为,只让实体在插入后不被跟踪?

目前我看到的唯一方法是忽略实体模型中的 CreationDate 字段,因为它没有被使用。 entity.Ignore(e => e.CreationDate);

【问题讨论】:

目前没有简单的方法可以做到。在 EF repo 上提交 github.com/aspnet/EntityFramework/issues/9118 以跟踪功能 如果实体框架没有为您提供您正在寻找的结果/性能,对我来说,这表明它更适合存储过程或自定义 SqlCommand @mathijspim 这是一种解决方法,但不是很好,因为它意味着在 .NET 代码中编写 SQL 代码 我不同意,我认为 Entity Framework 的重点是让基线快速运行。一旦复杂性超出标准 CRUD 操作,或者如果性能是一个特性(它就是),那么您需要降低级别。任何东西都可以被抽象出来。 这是我不会辩论的观点,因为所有选项都可能取决于具体情况。但是在我的情况下,我解决了它,等待一个好的解决方案 1. 将请求放在另一个线程中,2. 不时归档巨大的日志表,3. 摆脱 Azure 来完成这种工作 【参考方案1】:

您无需忽略该属性。创建默认构造函数并从服务器端初始化属性。

public  class User 

  public User()
    
        this.CreationDate= Datetime.UTC.Now; 
    
 public int UserId get;set;
 public Datetime CreationDate get;set;

它会在你初始化类时执行。

【讨论】:

以上是关于如何避免在 EF Core 中插入后选择插入的实体?的主要内容,如果未能解决你的问题,请参考以下文章

插入嵌套对象 EF Core 5

具有一对一关系的 EF Core 批量插入

如何将主无键实体插入表?

EF Generic Repository 从新插入的通用实体获取 Id

如何获取使用 EF Core 从存储过程中插入的记录的 id 值

EF Core Seeding 机制不插入数据