使用 EFCore.BulkExtensions 库方法 BulkInertOrUpdate 时区分插入的记录和更新的记录

Distinguish between inserted and updated records when using the EFCore.BulkExtensions library method BulkInertOrUpdate

提问人:GIovanni 提问时间:11/8/2023 最后编辑:GIovanni 更新时间:11/9/2023 访问量:53

问:

我必须在我的 SQL Server 数据库表中填写 和 列。 必须在插入时,而不是必须更新为每次更新记录时。我必须批量更新大量记录,因此我想使用库方法 BulkInsertOrUpdate
我设法通过将其默认设置为值并在其上使用批量配置来永久填充一次。
但是,我无法以正确的方式填写。
CreationTimeLatestUpdateCreationTimeDateTime.NowLatestUpdateDateTime.NowEFCore.BulkExtensionsCreationTimeDateTime.NowPropertiesToExcludeOnUpdateLatestUpdate

我尝试在填写后使用批量配置。但是,无论其他列是否已更新,此选项始终将我的字段更新为“现在”。我不明白这个选项是做什么用的。它似乎总是以相同的方式工作。
在文档中:
PropertiesToExcludeOnCompareDateTime.NowLatestUpdate

通过向 添加列名,将允许插入和更新该行,但如果该行中的任何其他列未更改,则不会更新该行。PropertiesToExcludeOnCompare

这在术语上似乎是矛盾的。如何将行标记为已更新?有没有办法发现,这样我就可以正确设置列? 综上所述:latestUpdate

BulkInsertOrUpdate(Entities, new BulkConfig()
{

    PropertiesToExcludeOnCompare = new List<string>()
    {
        nameof(BaseEntity.LatestUpdate)
    },
    PropertiesToExcludeOnUpdate = new List<string>()
    {
        nameof(BaseEntity.CreationTime)
    }

});

适用于 ,但不适用于CreationTimeLatestUpdate

.NET SQL-Server 实体框架 efcore.bulkextensions

评论

0赞 Denis Micheal 11/9/2023
“但此选项始终将我的 LatestUpdate 字段更新为 Now,无论其他列是否已更新”您是否使用已存在且不需要更新的记录进行调用?BulkInsertOrUpdate
0赞 GIovanni 11/9/2023
是的。在我的测试用例中就是这种情况。要求是我事先不知道是否应该插入或更新记录。这就是我使用 BulkInsertoOrUpdate 的原因。它是从 excel 导入的,可以包含以前存在于 db 上或应该新插入的记录。我有 LatestUpdate 列来区分它并在数据库上正确触发后续传输

答:

0赞 Denis Micheal 11/9/2023 #1

我尝试使用批量配置 PropertiesToExcludeOnCompare 在填充 DateTime.Now 后。但这个选项总是 将我的 LatestUpdate 字段更新为 Now,其他列是否已 更新与否。

确保对于已经存在的实体,并且您不会在调用 method 时初始化新值。DateTimeCreationTimeBulkInsertOrUpdate

在列表中,没有添加,这意味着如果您初始化它,即(值现在与数据库中的值不同)并继续调用该记录的所有字段将在数据库中更新,当然,因为它被排除在外。PropertiesToExcludeOnCompareCreationTimepublic DateTime CreationTime { get; set; } = DateTime.Now;BulkInsertOrUpdateCreationTimePropertiesToExcludeOnUpdate

如果是这种情况,那么解决方案是将其添加到列表中,以避免对数据库中存在的实体和记录进行比较。PropertiesToExcludeOnCompareCreationTime