#c# #asynchronous #async-await #entity-framework-core
#c# #асинхронный #async-await #entity-framework-core
Вопрос:
Мое требование — проверить, добавлен ли объект ContactType в объект dbcontext перед проверкой в БД.Я сделал это с помощью метода ChangeTracker . У меня есть вопрос относительно использования await для этого.
Q1. Поскольку мы не обращаемся к базе данных, нужно ли нам ожидать этого, поскольку эта запись добавляется к объекту в памяти (т.Е. dbcontext), и мы проверяем это.
public async Task<ContactType> GetOrCreateContactType(string contactTypeName)
{
if (string.IsNullOrWhiteSpace(contactTypeName))
{
return null;
}
ContactType contactType;
contactType = _dbContext.ChangeTracker.Entries()
.Where(x => x.State == EntityState.Added amp;amp; x.Entity is ContactType)
.Select(x => x.Entity as ContactType)
.FirstOrDefault(t => t.Name.ToUpper() == contactTypeName.ToUpper());
if (contactType != null)
{
return contactType;
}
else
{
contactType = await _dbContext.ContactTypes.SingleOrDefaultAsync(x => x.Name.ToUpper() == contactTypeName.ToUpper());
if (contactType != null)
{
return contactType;
}
}
//create if ContactType does not exists:
contactType = new ContactType()
{
Name = contactTypeName
};
_dbContext.ContactTypes.Add(contactType);
return contactType;
}
ИЛИ ЭТО
public async Task<ContactType> GetOrCreateContactType(string contactTypeName)
{
if (string.IsNullOrWhiteSpace(contactTypeName))
{
return null;
}
ContactType contactType=null;
await Task.Run(() =>
{
contactType = _dbContext.ChangeTracker.Entries()
.Where(x => x.State == EntityState.Added amp;amp; x.Entity is ContactType)
.Select(x => x.Entity as ContactType)
.FirstOrDefault(t => t.Name.ToUpper() == contactTypeName.ToUpper());
});
if (contactType != null)
{
return contactType;
}
else
{
contactType = await _dbContext.ContactTypes.SingleOrDefaultAsync(x => x.Name.ToUpper() == contactTypeName.ToUpper());
if (contactType != null)
{
return contactType;
}
}
//create if ContactType does not exists:
contactType = new ContactType()
{
Name = contactTypeName
};
_dbContext.ContactTypes.Add(contactType);
return contactType;
}
Комментарии:
1. Итак, единственное различие — это
Task.Run
иawait
перед ним?2. ДА. В этом разница.
3. Почему вы хотите запустить этот код в пуле потоков?
4. Используйте первый пример кода.