Witam.
Jest kilka problemow w tym kodzie z ktorymi to nie ma prawa zadziałać ale od początku.
1. Wyjatek ktory dostajesz to prawdopodobnie konsekwencja zapytania
AppUser appUser = _context.AppUsers.Single(u => u.Name == userId);
Generalnie w takich sytuacjach to proponuje Ci uzywać SingleOrDefault zamiast Single, ten pierwszy zwraca encje albo null ktory powinienes sprawdzic i w jakis sposob obsluzyc. A tutaj odrazu leci wyjatek z racji tego ze jak sam wspomniales, masz problem z uzyskanie Id zalogowanego uzytkownika. Jestes pewny ze masz dobrze skonfigurowanego identity providera? Nie widze nigdzie jaka forme identyfikacji uzywasz - ta metoda GetUserId() to jest dodatkowa metoda - sprobuj
User.Identity.Name
2. Kolejna sprawa to sam AppUser ktory ma interface ICollection, zawsze inicjuj kolekcje np:
public AppUser()
{
Categories = new List<Category>();
}
albo
public virtual ICollection<Category> Categories { get; set; } = new List<Category>();
Ja osobiscie uzywam prywatnych list a udostepniam je jako IReadOnlyList interface, ale to bardziej jesli stosujesz DDD.
3. Kolejna sprawa....
var categoryVM = new Category { Name = category.Name, AppUser = appUser };
Nie znam dokladnie kontekstu tego co robisz ale zdajesz sobie sprawe ze to co tutaj robisz to tworzy nowy rekord kategorii w tabeli kategorie razem z relacja... hmmm... moze tak wlasnie chcesz to zrobic ale zwykle w takich sytuacjach to Category to jest cos w rodzaju lookup table, z UI przychodza parametry, wyciagasz z bazy Usera i Category i dodajesz juz istniejaca kategorie to Usera, ale tak jak pisalem wczesniej to nie znam kontekstu, moze tak wlasnie chcesz robic jak robisz :) I jeszcze jedno do tej linii - jak sie juz czepiam to na calego :P - dlaczego categoryVM? to jest po prostu category.
categoryVM powinien byc raczej tutaj:
public ActionResult Create(CategoryAndAppUserViewModel categoryVM)
Pozdrawiam serdecznie i powodzenia!