如何避免在 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 Generic Repository 从新插入的通用实体获取 Id