Tworzenie modelu

0

Cześć. Mam takie pytanie tworzę forum. I mam taki problem jak dodać przy każdej kategori liczbę postów ?
Mam zapisywać to do bazy stworzyć model a jesli tak to jak ten model ma wyglądać ?

    <table class="table table-striped">
        <tbody>
            @foreach (var item in Model)
            {
                <tr>
                    <td>
                        <h2><a asp-action="Index" asp-controller="Post" asp-route-categoryId="@item.Id" >@item.Name</a></h2>
                        <p>@item.Description</p>
                    </td>
                    <td>

                    </td>
                </tr>
            }
        </tbody>
    </table>
        public IActionResult Index()
        {
            var model = categoryService.GetAll();
            return View(model);
        }
1

Nie zapisuj tego do bazy - to przecież da się z bazy wyciągnąć bez problemu. Możesz wykorzystać koncepcję ViewModelu - to jest taki model, który jest przesyłany do widoku i nie musi dokładnie odpowiadać temu, co jest w bazie danych.

Na przykład:

public class CategoryViewModel
{
    public string Name { get; set; }
    public string Description { get; set; }
    public int Posts { get; set; }
}

Natomiast twoja funkcja categoryService.GetAll() nie będzie zwracała IEnumerable<Category>, ale IEnumerable<CategoryViewModel>, w którym dla każdej kategorii sama policzy (albo weźmie zapisane albo skorzysta z cache albo...) liczbę postów i zapisze w odpowiednie miejsce.

0

kurcze a jak ta funckja GetAll() ma wyglądać tak ?

        public IEnumerable<CategoryViewModel> GetAll()
        {
            IEnumerable<Category> list = db.Categories;

            IEnumerable<CategoryViewModel> model = list as IEnumerable<CategoryViewModel>;

            foreach (var item in model)
            {
                item.AmountPosts = postService.GetAmountPosts(item.Id);
            }
            return model;
        }

Wyskakuje mi komunikat że brakuje kolumny w bazie :(

1

Nie, nie, musisz ręcznie stworzyć listę swoich CategoryViewModel, samo rzutowanie nic nie da.

Raczej coś takiego:

public IEnumerable<CategoryViewModel> GetAll()
{
    var categories = db.Categories.ToList();
    var result = new List<CategoryViewModel>();

    foreach (var item in categories)
    {
        result.Add(new CategoryViewModel { Name = item.Name, Description = item.Description, Posts = postService.GetAmoutPosts(item.Id) });
    }

    return result;
}
2

Ale zapisywanie w osobnej kolumnie w tabeli nie jest zle. Teraz lecisz cos na kształt N+1. Lepiej ograć jednym selectem niz N

1 użytkowników online, w tym zalogowanych: 0, gości: 1