Update kodu po publikacji w folderze i wdrożeniu na serwer

1

Chcę wdrożyć apkę z bazą danych na mój własny serwer z systemem windows server 2019 stand.
Jak wdrożyć wiem. Chodzi mi jedynie co zrobić jeśli za jakiś czas baza danych będzie już
miała jakieś dane, a ja będę chciał zrobić np. update struktury bazy (w postaci nowej tabeli) albo
po prostu będę chciał zmienić lub dodać kod powiedzmy od strony Widoku.
No bo jeśli zrobię znowu wdrożenie przez folder a potem przeniosę wszystko na serwer
to baza będzie bez danych, a ja bym wolał "jednak" owe dane zachować.
Jak to zatem zrobić? Oczywiście mowa o mvc.

0

Musisz obserwować migracje. Jak masz bazę danych i używasz EF Core to masz np.:

  1. Migracja A (dodanie tabeli A, dodanie tabeli B)
  2. Migracja B (dodanie tabeli C, dodanie tabeli D)

Następnie wgrywasz to na serwer i i potem jak dodasz lokalnie migrację np. dodaj kolumnę X do tabeli B, to doda Tobie tą kolumnę. Musisz tylko uważnie czytać przez zastosowaniem, co robi owy kod w zdarzeniu migracji. Przy dodaniu kolumny czy tabeli nie tracisz żadnych danych.

0

jak potrzebujesz zrobić jakiś update na bazie bez zmian w kodzie to najłatwiej będzie po prostu puścić update wprost do bazy. Jak zmiany w kodzie też są potrzebne No to powinno to iść jednocześnie przy wdrożeniu.

Są narzędzia do tego, np:
https://dbup.readthedocs.io/en/latest/
https://www.liquibase.org/

0
gswidwa1 napisał(a):

Musisz obserwować migracje. Jak masz bazę danych i używasz EF Core to masz np.:

  1. Migracja A (dodanie tabeli A, dodanie tabeli B)
  2. Migracja B (dodanie tabeli C, dodanie tabeli D)

Następnie wgrywasz to na serwer i i potem jak dodasz lokalnie migrację np. dodaj kolumnę X do tabeli B, to doda Tobie tą kolumnę. Musisz tylko uważnie czytać przez zastosowaniem, co robi owy kod w zdarzeniu migracji. Przy dodaniu kolumny czy tabeli nie tracisz żadnych danych.

Przepraszam ale nie zrozumiałeś. Albo to ja nie rozumiem tego co piszesz. Ja wiem jak dodać
migrację i zrobić updata bazy. Mnie chodzi o coś innego. Jestem na komputerze lokalnym i robię "publica" do
folderu. Teraz przenoszę zawartość tego folderu na serwer zdalny. Po prostu przenoszę wszystko z folderu
public (w paczce a potem rozpakowuję, wiadomo) i teraz jeśli już w aplikacji dostępnej w necie zostaną w
bazie zapisane jakieś dane, a potem na komputerze lokalnym coś "zmienię" w apce, to jak zrobić update
apki na serwerze tak żeby nie zresetowała się do "zera" baza danych. O to mi właśnie chodzi.

edit: Czytam twoją odpowiedź i myślę ... no tak, zmiana struktury nie zmienia zawartości, ja wiem, ale
jeśli zmieniam strukturę to tylko lokalnie. A przecież dane zapisywane są zdalnie. No to jak puszcze
jeszcze raz publica do folderu i przeniosę to wszystko na serwer zdalny, to mi się zresetuję do zera
cała baza, hę?

edit2: Ech doopa blada jestem. W sumie chyba o to chodzi.
Tylko czy to faktycznie zadziała. Github city.
https://discuss.codecademy.com/t/how-to-make-changes-on-a-website-already-published/643917/7

0

Ale publikacja kodu do iis nie zamienia Tobie bazy danych tylko pliki aplikacji webowej. To dwie różne rzeczy. :)

0
gswidwa1 napisał(a):

Ale publikacja kodu do iis nie zamienia Tobie bazy danych tylko pliki aplikacji webowej. To dwie różne rzeczy. :)

O, a ja myślałem że jak puszczę publica to baza danych w folderze public też zapisze. Tzn.
wcześniej tak nie myślałem, ale dzisiaj widziałem jakiś tutek na ytube, w którym gość po prostu puszcza
do folderu public także wszystkie migracje i już trochę zgłupiałem. Czyli w takim razie muszę
na serwerze utworzyć oddzielnie bazę danych? To gdzie się w takim razie zapisuje sama baza
gdy daję publica?

1

A czy twoja baza danych znajduje sie w folderze wwwroot? Nie sądzę
Publikujesz aplikacje internetową za pomocą przycisku publish w vs
Zmieniasz strukturę bazy danych z pomoca ef migrations

0

@gswidwa1: Kurcze !! Masz rację !! A od czego jest connection string !! Jak Boga Kocham !!
Nie, sorry. Po prostu chwilowe nieprogramistyczne problemy i nieprzespana noc. Sorry.
**
Natomiast nawiązując do twoich "editów". Tak tak, ja wiem. Tylko... aha, czyli jeśli będę chciał zmodyfikować
kod i wysłać zmodyfikowany kod na serwer zdalny to wtedy opcja public, jak zmodyfikuję opcją ef migr strukturę
bazy lokalnie (i wszystko będzie działać lokalnie) to mogę wtedy na zdalnym serwerze ręcznie zmodyfikować
kod bazy danych przez alter table.

0

Nie, bazę danych produkcyjną sql też modyfikuj z ef migrations. Ja mam ustawione tak, że jak mam tryb debug i używam ef core to updateuje poleceniem update-database baze lokalną, a jak w release to produkcyjną

0
gswidwa1 napisał(a):

Nie, bazę danych produkcyjną sql też modyfikuj z ef migrations. Ja mam ustawione tak, że jak mam tryb debug i używam ef core to updateuje poleceniem update-database baze lokalną, a jak w release to produkcyjną

Sorry, napisz proszę jak to poustawiać.
Czekaj moment coś znalazłem :D

1

W app settings masz connection string i ustawiasz tam parametry połączenia z bazą danych dla debug i release

2

Można przy starcie z automatu wywołać migrację

private void MigrateDatabase(IApplicationBuilder app)
        {
            using (var serviceScope = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>().CreateScope())
            {
                var dbContext = serviceScope.ServiceProvider.GetService<TwójDbContext>();
                dbContext.Database.Migrate();
                Seeder.SeedDatabase(dbContext);
            }
        }

Czyli po wdróżeniu apki jak się uruchomi to migracje z automatu się zastosują na db

0
gswidwa1 napisał(a):

W app settings masz connection string i ustawiasz tam parametry połączenia z bazą danych dla debug i release

@gswidwa1: Sorry czy mógłbyś/mogłabyś pokazać przykład jak wtedy będzie mniej więcej wyglądał plik appsettings.json?

1

AppSettings.Development.json

{
  "ConnectionStrings": {
    "LocalDB": "Server=localhost;Database=anydatabasename;Trusted_Connection=true"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  }
}

AppSettings.json

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "ConnectionStrings": {
    "LocalDB": "Server=tcp:mysqlserver.database.windows.net,1433;Initial Catalog=mydb;Persist Security Info=False;User ID=ad;Password=awdwwgawg;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;"
  },
  "AllowedHosts": "*"
}

Następnie w startup.cs / program.cs:

builder.Services.AddDbContext<ApplicationDbContext>(options =>
                options.UseSqlServer(
                    builder.Configuration.GetConnectionString("LocalDB")));

ApplicationDbContext:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
    {
        public virtual DbSet<FormGroup> FormGroups { get; set; }
        public virtual DbSet<Form> Forms { get; set; }
        public virtual DbSet<FormAssocciate> FormAssocciates { get; set; }
        public virtual DbSet<FormHistory> FormHistories { get; set; }
        public virtual DbSet<FormArchive> FormArchives { get; set; }
        public virtual DbSet<Notification> Notifications { get; set; }

        public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
            : base(options)
        {

        }
    }
0
gswidwa1 napisał(a):

AppSettings.Development.json

{
  "ConnectionStrings": {
    "LocalDB": "Server=localhost;Database=anydatabasename;Trusted_Connection=true"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  }
}

AppSettings.json

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "ConnectionStrings": {
    "LocalDB": "Server=tcp:mysqlserver.database.windows.net,1433;Initial Catalog=mydb;Persist Security Info=False;User ID=ad;Password=awdwwgawg;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;"
  },
  "AllowedHosts": "*"
}

@gswidwa1: Ok, i teraz jeśli dobrze zrozumiałem jeśli będę chciał puścić update-database na server bazy zdalny to
po prostu przełączam "na lewo od any cpu" z debug na release? Bo nie jestem pewny czy tak miałem zrozumieć.
**
Tylko się zastanawiam. Bo wydawało mi się że po Server jest np. adres IP Servera bazy danych?
A ty zrobiłeś "Server=tcp:mysqlserver.database...."??

0

@gswidwa1: Cześć, postanowiłem odświeżyć ten wątek żeby nie tworzyć nowego, bo mój obecny problem dotyczy tego właśnie tematu. Zrobiłem jak kazałeś i jak miałem ustawione na debug, to normalnie zrobiło mi update bazy lokalnie. Potem dałem u góry release i zrobiło mi update zdalnie, czyli wszystko pięknie. Jednak teraz
jest coś dziwnego. U góry mam ustawione debug i update robi mi od razu na zdalny serwer;-))))))) Tzn. nie robi mi update'a w ogóle na lokalny a przecież
w konfiguracji oraz w json'ie niczego nie zmieniałem. Dziwne.

edit:
Dobra, zrobiłem na pałę bo nie wiem gdzie działam źle. Po prostu zapisałem sobie konfigurację w oddzielnym
pliku i w json'ie będę sobie najwyżej zmieniał. No bo to dziwne kurczę. W sumie powinno działać.
Gdzieś w jakichś opcjach muszę mieć coś nie tak jak potrzeba.

1

po pierwsze upewnij sie ze wczytujesz oba pliki json - w zaleznosci od srodowiska
np

        var configuration = new ConfigurationBuilder()
            .SetBasePath(AppsettingsConfigurator.ExecutableDirPath())
            .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
            .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
            .Build();

podczas debugowania mozesz sobie zobaczyc jaki masz EnvironmentName
zasada jest taka, ze kazdy kolejny JsonFile nadpisuje poprzedni, wiec, jezeli uruchomie to z profilu, który ustawia zmienna srodowiskowa na xdlol321 i taki plik bedzie istniał i o ile bedzie miał ustawiony connectionString, to zostanie uzyty connectionString z pliki appsettings.xdlol321.json

po drugie zobacz w launch settings jaki masz EnvironmentName dla danego 'profilu', czyli mówiąc prosto to, co jest obok zielonej strzałki którą odpalasz/debugujesz apke :)

{
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:60767",
      "sslPort": 0
    }
  },
  "$schema": "http://json.schemastore.org/launchsettings.json",
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "launchUrl": "swagger",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      },
      "nativeDebugging": true
    },
"Docker": {
  "commandName": "Docker",
  "launchBrowser": true,
  "launchUrl": "{Scheme}://{ServiceHost}:{ServicePort}/weatherforecast",
  "publishAllPorts": true,
  "useSSL": true
}

}
}
screenshot-20230708064059.png

jak widzisz tutaj odpalenie z profilu IIS nada wartosc Development zmiennej srodowiskowej Environment

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