• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

ASP.NET MVC Jak dodać rekord bazy danych z polem użytkownika ustawionym na aktualnie zalogowanego użytkownika

VPS Starter Arubacloud
0 głosów
907 wizyt
pytanie zadane 2 grudnia 2019 w C# przez Archeon Początkujący (480 p.)

Mam problem z dodaniem kategorii do zalogowanego użytkownika. Mam błąd System.InvalidOperationException: „Sekwencja nie ma elementów.”.

 

public class AppUser
{
    public int Id { get; set; }
    public string Nickname { get; set; }
    public string Name { get; set; }
    public string Surname { get; set; }
    public DateTime BirthDate { get; set; }
    public virtual ICollection<Category> Categories { get; set; }

}

public class Category
{
    public int Id { get; set; }
    public string Name { get; set; }
    public AppUser AppUser { get; set; }
    public int AppUserId { get; set; }

}

public class CategoryAndAppUserViewModel
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int AppUserId { get; set; }
}

Kontroler:

 

// GET: Categories/Create
public ActionResult Create()
{
    return View();
}

// POST: Categories/Create
[Authorize]
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(CategoryAndAppUserViewModel category)
{
    if (ModelState.IsValid)
    {

        string userId = User.Identity.GetUserId();
        AppUser appUser = _context.AppUsers.Single(u => u.Name == userId);
        var categoryVM = new Category { Name = category.Name, AppUser = appUser };
        appUser.Categories.Add(categoryVM);
        _context.SaveChanges();
        return RedirectToAction("Index");
    }

    return View(category);
}

Chcę to zrobić: gdy użytkownik jest zalogowany, przechodzi do Moich przykładów, tworzy nową kategorię, wypełnia nazwę nowej kategorii, aplikacja musi automatycznie dodać nową kategorię do zalogowanego użytkownika. Głównym problemem jest uzyskanie identyfikatora zalogowanego użytkownika

 

4 odpowiedzi

0 głosów
odpowiedź 2 grudnia 2019 przez tomek2323 Bywalec (2,050 p.)
Spróbuj w AppUser zrobić konstruktor

musisz po tym walnąć migracje albo usuń i utwórz na nowo baze

public class AppUser

{

public AppUser()

{

this.Categories = new HashSet<Category>();

}

 

    public int Id { get; set; }

    public string Nickname { get; set; }

    public string Name { get; set; }

    public string Surname { get; set; }

    public DateTime BirthDate { get; set; }

    public virtual ICollection<Category> Categories { get; set; }

 

}
komentarz 2 grudnia 2019 przez Archeon Początkujący (480 p.)
Szczerze co mi to daje? Mogę prosić o rozwinięcie?
komentarz 2 grudnia 2019 przez tomek2323 Bywalec (2,050 p.)
Dodajesz coś do kolekcji której nie masz :)
komentarz 2 grudnia 2019 przez Archeon Początkujący (480 p.)
Poczytałem to co mi wysłałeś i wynika z tego że kod który napisałem stosuje się do przykładu 2. Co dalej ?
komentarz 2 grudnia 2019 przez tomek2323 Bywalec (2,050 p.)
Konstruktor nie pomógł?
komentarz 2 grudnia 2019 przez Archeon Początkujący (480 p.)
Niestety, ale nie. Wciąż to samo System.InvalidOperationException: „Sekwencja nie ma elementów.”.
komentarz 2 grudnia 2019 przez tomek2323 Bywalec (2,050 p.)
Błąd wywala  w linijce dodawania? debugowałeś ? dziwne trochę
0 głosów
odpowiedź 2 grudnia 2019 przez Siemił Mądrala (7,380 p.)
Nie znam sie na asp. Ale nie widze gdzie tworzysz liste cotegori. W klasie masz tylko wlasciwosc. Konstruktor usera tylko domyslny a po pobraniu starasz sie do kolekcji dodac kategorie. Sproboj przed dodaniem kategori stworzyc obiekt listy.
0 głosów
odpowiedź 3 grudnia 2019 przez Crash182 Gaduła (3,600 p.)

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!

0 głosów
odpowiedź 3 grudnia 2019 przez Snejki Stary wyjadacz (14,520 p.)

Spróbuj utworzyć kategorię w ten sposób:        

var categoryVM = new Category { Name = category.Name, AppUseIdr = userId };

a następnie:

_context.Categories.Add(categoryVM);

 

Podobne pytania

0 głosów
0 odpowiedzi 107 wizyt
pytanie zadane 22 stycznia 2020 w C# przez michael2424 Nowicjusz (140 p.)
0 głosów
0 odpowiedzi 124 wizyt
pytanie zadane 7 grudnia 2020 w C# przez dz3101 Nowicjusz (220 p.)
0 głosów
0 odpowiedzi 349 wizyt

92,979 zapytań

141,943 odpowiedzi

321,189 komentarzy

62,308 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...