Połącznie się i wstawienie wartości do bazy danych

0

Witam,
Chcę zrobić aplikację która pobiera w formularzu wartość od klienta, po czym wyświetla odpowiedni komunikat. Każde zapytanie do serwera musi być zapisane do bazy danych(lokalnej). Taki jeden zapis musi posiadać wartość wpisaną do formularza, ip klienta , oraz komunikat od serwera.

Czy mógłby ktoś polecić jakiś poradnik jak wpisać do bazy danych wartość? Czyli najlepiej całą obsługę(połączenie, wpisanie(insert)).
Szukałem trochę w internecie, ale każdy film się różni i już sam nie wiem który sposób mam wybrać.

Wklejam poniżej mój kod, abyście widzieli czy to ma sens. Dodam że dopiero się uczę i mogą być tu głupoty.

Kontroler:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Zadanie1CEZ.Models;
using static Microsoft.AspNetCore.Hosting.Internal.HostingApplication;

namespace Zadanie1CEZ.Controllers
{

    public class FizzBuzzController : Controller
    {
        [HttpGet]
        public IActionResult Index()
        {
            
            return View();
        }
        //pobranie ip od klienta
        public string ip()
        {
            var remoteIpAddress = Request.HttpContext.Connection.RemoteIpAddress.ToString();
            return remoteIpAddress;
        }
        [HttpPost]
        public string Index(FizzBuzzRequestDTO request)
        {
            var service = new FizzBuzzService();
            request.ip = ip();
            FizzBuzzResoultDTO resoult = service.Validate(request);
            return resoult.Tekst+" || Twoje IP to: "+ip();
        }
        
    }
}

Widok (index):

@model Zadanie1CEZ.Models.FizzBuzzRequestDTO

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
</head>
<body>
    @using (Html.BeginForm())
    {
        <p>Podaj liczbę: @Html.TextBoxFor(x=>x.Tekst)</p>

        <input type="submit" value="Wyślij liczbę" />
    }

</body>
</html>

DTO:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace Zadanie1CEZ.Models
{
    public class FizzBuzzRequestDTO
    {
        public string Tekst { get; set; }
        public string ip { get; set; }
    }

    public class FizzBuzzResoultDTO
    {
        public FizzBuzzResoultDTO(string tekst)
        {
            Tekst = tekst;
        }

        public string Tekst { get; }
    }
}

Logika:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace Zadanie1CEZ.Models
{
    public class FizzBuzzService
    {
        public FizzBuzzResoultDTO Validate(FizzBuzzRequestDTO request)
        {
            int konw;
            bool succes = Int32.TryParse(request.Tekst, out konw);
            if (!succes)
            {
                return new FizzBuzzResoultDTO("Wprowadzono nieprawidłowy format danych. Podaj liczbę całkowitą");
            }
            int liczba = Convert.ToInt32(request.Tekst);

            if (liczba > 100 || liczba < 1)
            {
                return new FizzBuzzResoultDTO("Liczba nie jest z określonego przedziału, czyli <1,100>");
            }

            if ((liczba % 3) == 0 && (liczba % 5) == 0)
            {
                if (liczba % 7 == 0)
                {
                    return new FizzBuzzResoultDTO("FizzBuzzWizz");
                }
                return new FizzBuzzResoultDTO("FizzBuzz");
            }

            if((liczba % 3) == 0 && (liczba % 7) == 0)
            {
                return new FizzBuzzResoultDTO("FizzWizz");
            }

            if((liczba % 7) == 0 && (liczba % 5) == 0)
            {
                return new FizzBuzzResoultDTO("BuzzWizz");
            }

            if (liczba % 7 == 0)
            {
                return new FizzBuzzResoultDTO("Wizz");
            }

            if ((liczba % 3) == 0)
            {
                return new FizzBuzzResoultDTO("Fizz");
            }

            if ((liczba % 5) == 0)
            {
                return new FizzBuzzResoultDTO("Buzz");
            }

            return new FizzBuzzResoultDTO(request.Tekst+" Nie podzielna przez 3, 5 oraz 7");
        }
    }
}

0

Korzystam z poradnika:
https://stackify.com/entity-framework-core-tutorial/#post-22226-_hc6vanypp8d9

Czyli w folderze model mam napisać tę klasę(w moim przypadku)?

using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using static Microsoft.AspNetCore.Hosting.Internal.HostingApplication;

namespace Zadanie1CEZ.Models
{
    public class Context : DbContext
    {
        public Context(DbContextOptions<Context> options) : base(options)
        {
        }

        public DbSet<FizzBuzzRequestDTO> fizzBuzzRequestDTOs { get; set; }
    }
}

a co z tym?

var optionsBuilder = new DbContextOptionsBuilder<Context>();
optionsBuilder.UseSqlServer("Server=(local);Database=hive_develop;Trusted_Connection=True;");
var context = new Context(optionsBuilder.Options);

gdzie mam to wpisać?

1

1: Tak, ale raczej nie DTO, ale to pomińmy na teraz.

To drugie do Startup.cs -> ConfigureServices

0

Ok dzięki.
Na ten moment zrobiłem Context.cs i w startup.cs zmieniłem.
Co dalej należy zrobić?
co np z tym?

await context.Database.EnsureCreatedAsync()
0

Jeżeli baza nie będzie utworzona, to ją utworzy. Nie wiem gdzie powinno się to wrzucać, ale możesz np w Startupie do Configure przekazać context i tam to użyć.

0

Wyszło mi chyba. Czy w kontrolerze tak to powinno wyglądać?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Zadanie1CEZ.Models;

namespace Zadanie1CEZ.Controllers
{

    public class FizzBuzzController : Controller
    {

        private readonly Context _context;

        public FizzBuzzController(Context context)
        {
            _context = context;
        }


        [HttpGet]
        public IActionResult Index()
        {
            
            return View();
        }
        //pobranie ip od klienta
        public string ip()
        {
            var remoteIpAddress = Request.HttpContext.Connection.RemoteIpAddress.ToString();
            return remoteIpAddress;
        }


        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<string> Index([Bind("Tekst,ip,odp")] FizzBuzzRequestDTO request)
        {

            var service = new FizzBuzzService();
            request.ip = ip();
            FizzBuzzResoultDTO resoult = service.Validate(request);
            request.odp = resoult.Tekst;

            if (ModelState.IsValid)
            {
                _context.Add(request);
                await _context.SaveChangesAsync();
                
            }
            return resoult.Tekst + " || Twoje IP to: " + ip();
        }

    }
}
0

FizzBuzzService to chyba powinno być wstrzyknięte do konstruktora tego kontrollera

https://docs.microsoft.com/pl-pl/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-2.2

[Bind("Tekst,ip,odp")]
Z tego co kojarzę, to bindów powinno się używać wtedy, gdy nie chcesz aby coś z np. formularza zostało zmapowane do twojego modelu parametru metody kontrolera. Tutaj tego IP chyba nie chciałbyś aby ktoś sobie dosłał z formularza (chociaż i tak by się nadpisał)

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