提问人:Kyle 提问时间:7/4/2023 更新时间:7/4/2023 访问量:233
“FirstOrDefaultAsync”方法 -- 它是否触发 EF 开始跟踪给定实体
The "FirstOrDefaultAsync" method -- Does it trigger EF to start tracking the given entity
问:
提供的方法是否触发实体框架 (EF) 开始跟踪给定实体?FirstOrDefaultAsync
Microsoft.EntityFrameworkCore
例如,据我了解,该方法“告诉”EF 开始跟踪给定实体。AddAsync
谢谢!
答:
0赞
wenbingeng-MSFT
7/4/2023
#1
该方法用于检索满足指定条件的第一个元素,如果未找到此类元素,则检索默认值。它是一种查询方法,不涉及修改实体的状态或指示 EF 跟踪实体。FirstOrDefaultAsync
AddAsync()
是 100% 异步安全的,而仅在某些情况下是异步安全的。
有关详细信息,可以参考 EF Core 中的 AddAsync() 与 Add()Add()
这些都与跟踪给定实体没有直接关系。
对于跟踪给定的实体,可以多加注意,下面是一个例子,通过捕捉来跟踪实体和字段,因为通常是在:SaveChanges
DbUpdateException
DbUpdateException
SaveChanges
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}");
}
}
评论
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 开始跟踪?context
DbContext
Characteristic
context
DbSet
id
Characteristic
Id
IsActive
var 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))
评论
Select