“FirstOrDefaultAsync”方法 -- 它是否触发 EF 开始跟踪给定实体

The "FirstOrDefaultAsync" method -- Does it trigger EF to start tracking the given entity

提问人:Kyle 提问时间:7/4/2023 更新时间:7/4/2023 访问量:233

问:

提供的方法是否触发实体框架 (EF) 开始跟踪给定实体?FirstOrDefaultAsyncMicrosoft.EntityFrameworkCore

例如,据我了解,该方法“告诉”EF 开始跟踪给定实体。AddAsync

谢谢!

asp.net Visual-Studio Linq 实体框架核心

评论

0赞 Svyatoslav Danyliv 7/4/2023
是的。EF Core 会自动跟踪返回单个或 FULL 项集合(不是自定义投影方式)的所有函数。Select
0赞 Kyle 7/5/2023
@topsail我开始了一份新工作,并试图理解现有的代码库。我将在下面提供我能提供的内容。
0赞 Kyle 7/5/2023
“是的。EF Core 会自动跟踪返回单个或完整项集合(不是通过 Select 自定义投影)的所有函数。– 斯维亚托斯拉夫·丹尼利夫“ 感谢您的输入。@wenbingeng-MSFT似乎有不同的想法(请参阅下面的答案)。

答:

0赞 wenbingeng-MSFT 7/4/2023 #1

该方法用于检索满足指定条件的第一个元素,如果未找到此类元素,则检索默认值。它是一种查询方法,不涉及修改实体的状态或指示 EF 跟踪实体。FirstOrDefaultAsync

AddAsync()是 100% 异步安全的,而仅在某些情况下是异步安全的。 有关详细信息,可以参考 EF Core 中的 AddAsync() 与 Add()Add()

这些都与跟踪给定实体没有直接关系。

对于跟踪给定的实体,可以多加注意,下面是一个例子,通过捕捉来跟踪实体和字段,因为通常是在:SaveChangesDbUpdateExceptionDbUpdateExceptionSaveChanges

         try
         {

             using (var context = new EfContext())
             {

                 var data = new TestTable
                 {
                     Status = TestTableStatus.Status1.ToString(),
                     Content = "One-to-many test",
                     TestTableItems = new List<TestTableItem> {
                     new TestTableItem { Name = "Add one-to-many 1", Id = 123},

                     new TestTableItem {Name = "Add one-to-many 2" } }
                 };

                 context. Add(data);

                 await context. SaveChangesAsync();
             }
         }
         catch (DbUpdateException ex)
         {

             var failedEntries = ex.Entries;
             foreach (var entry in failedEntries)
             {
                 var entityName = entry. Metadata. Name;
                 Console.WriteLine($"Failed to add in entity: {entityName}");

             }
         }

enter image description here

评论

0赞 Kyle 7/5/2023
感谢您的输入!回复的其他人之一似乎不同意你的观点(我恭敬地说)。@Svyatoslav丹尼利夫说:“是的。EF Core 会自动跟踪返回单个或完整项集合(不是通过 Select 自定义投影)的所有函数。我想我需要一个决胜局的答案。有趣的是,Chat GPT 也给了我混合信号,这就是我来这里的原因!:o)
0赞 wenbingeng-MSFT 7/5/2023
@Kyle 嗨,看来你有点误会我了。我同意斯维亚托斯拉夫·丹尼利夫的观点。但似乎不是你指出的代码实际上对给定实体进行跟踪。而是 SaveChanges。希望我的回答能帮到你
0赞 Kyle 7/5/2023
@wenbengeng-MSFT 感谢您抽出宝贵时间接受采访!下面是一些示例代码,可以说明我的实际代码。假设是 的实例,是 的属性,也是 的实例,并且是调用方法传递的参数。此外,assume 具有 int 属性和布尔属性。 前面的哪一行代码“告诉”EF 开始跟踪?contextDbContextCharacteristiccontextDbSetidCharacteristicIdIsActivevar entity = context.Characteristic.FirstOrDefaultAsync(c => c.Id.Equals(id)); entity.IsActive = false; context.SaveChangesAsync();
0赞 wenbingeng-MSFT 7/6/2023
@Kyle 嗨,从“var entity = context.Characteristic.FirstOrDefaultAsync(c => c.Id.Equals(id));“,这里是上下文在跟踪中起作用。但是,通过DbUpdateException在“上下文”中捕获跟踪的实体更容易。SaveChangesAsync();“,如上面的代码所示。
0赞 Kyle 7/6/2023
谢谢!所以澄清一下,你是说这条线是 EF 开始跟踪实体的地方?context.Characteristic.FirstOrDefaultAsync(c => c.Id.Equals(id))