【问题标题】:How to avoid inserted entity to be selected after insert in EF Core?如何避免在 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 来完成这种工作

标签: asp.net-core .net-core azure-sql-database entity-framework-core


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2011-03-27
    • 2020-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-26
    • 1970-01-01
    相关资源
    最近更新 更多