Причина
Эта ошибка возникает из-за того, что вы пытаетесь попросить EF Core не отслеживать список GUID
.Однако список Guid - это список типов значений.
Как вы знаете, EF Core может отслеживать только серию ссылочного типа, поэтому сигнатура метода для AsNoTracking<TEntity>()
равна:
public static IQueryable<TEntity> AsNoTracking<TEntity> (this IQueryable<TEntity> source)
where TEntity : class;
Обратите внимание на ограниченияwhere TEntity : class
.
Другими словами, вы никогда не сможете вызвать AsNoTracking<Guid>()
:
Events = await _context.Events
.SelectMany(e => e.EventAdmins.Where(x => x.EventId == e.Id).Select(x => x.AdminRoleId))
.AsNoTracking() // Actually, it will invoke `AsNoTracking<Guid>()`
.ToListAsync();
Как исправить
Ваш SQL не выглядит корректным.Я думаю, вы хотите вернуть {Id, Name, EventRoleId}
.
Если вы хотите сделать это с SelectMany
, вы можете просто сделать запрос, как показано ниже:
var Events = await this._context.Events
.SelectMany(
e => e.EventAdmins.Where(x => x.EventId == e.Id).Select(x => x.AdminRoleId),
(p,g) => new {
Id = p.Id,
Name = p.Name,
EventRoleId = g
}
)
// .AsNoTracking()
.ToListAsync();
Там нетнужно звонить .AsNoTracking()
на все .Поскольку отслеживание не выполняется, если результирующий набор не содержит никаких типов сущностей .
В качестве примечания не следует украшать Event.EventAdmins
атрибутом [ForeignKey("Id")]
:
public class Event {
public Guid Id { get; set; }
public string Name { get; set; }
<strike>[ForeignKey("Id")]</strike>
public IList EventAdmins { get; set; }
}
Поскольку Event
является главной сущностью, аEventAdmin
является зависимым объектом.Только EventAdmin
имеет внешний ключ, который ссылается на Event
.