- talmida: Változások
- sziku69: Fűzzük össze a szavakat :)
- 25
- Kalacskepu: Elrontott Radeon X1950 Pro megjavítása
- sziku69: Szólánc.
- Luck Dragon: Asszociációs játék. :)
- D1Rect: Nagy "hülyétkapokazapróktól" topik
- Magga: PLEX: multimédia az egész lakásban
- kreténtehén: Gazdit keresünk
- GoodSpeed: AMD Ryzen 7 7700X vs AMD Ryzen 9 9900X AIDA64, és PCMark 10 Benchmarkokban mérve
Új hozzászólás Aktív témák
-
Keem1
veterán
Sracok, egy nagy anomaliaba utkoztem.
Csinaltam egy szuz ASP Razor porjectet, en populaltam fel, de hibaba utkoztem.Alapesetben ezt kapom:
PS C:\Users\ik\source\repos\nuup> dotnet run -c Release -f net6.0
Building...
C:\Program Files\dotnet\sdk\7.0.405\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.Sdk.DefaultItems.Shared.targets(213,5)
: error NETSDK1022: Duplicate 'Content' items were included. The .NET SDK includes 'Content' items from your project di
rectory by default. You can either remove these items from your project file, or set the 'EnableDefaultContentItems' pr
operty to 'false' if you want to explicitly include them in your project file. For more information, see https://aka.ms
/sdkimplicititems. The duplicate items were: 'wwwroot\css\site.css'; 'wwwroot\errors\error.html'; 'wwwroot\robots.txt'
[C:\Users\ik\source\repos\nuup\nuup.csproj::TargetFramework=net6.0]
The build failed. Fix the build errors and run again.
PS C:\Users\ik\source\repos\nuup>Ha beteszem ezt:
<EnableDefaultContentItems>false</EnableDefaultContentItems>
akkor viszont minden oldal 404-es lesz, a full kezdolapot is beleertve.Ez a csproj file-m:
<Project Sdk="Microsoft.NET.Sdk.Web"> <PropertyGroup> <TargetFrameworks>net6.0;net7.0</TargetFrameworks> <Nullable>enable</Nullable> <ImplicitUsings>enable</ImplicitUsings> <EnableDefaultContentItems>false</EnableDefaultContentItems> </PropertyGroup> <ItemGroup> <Folder Include="Data\"/> <Folder Include="Models\"/> <Folder Include="Classes\"/> <Content Include="wwwroot\**\*"> <CopyToPublishDirectory>Always</CopyToPublishDirectory> </Content> </ItemGroup></Project>Mit rontok el?
-
Keem1
veterán
Srácok, ebben kérnék helpet.
Részletek: .NET 6.0 console, VS CodeOutput Windowson:
NewGen v1.1.124.1223
Album
Artist
Customer
Employee
Genre
Invoice
InvoiceLine
MediaType
Playlist
PlaylistTrack
Track
Press any key...Output Linuxon:
NewGen v1.1.124.1223
Unhandled exception. System.IO.FileLoadException: Could not load file or assembly 'System.Diagnostics.DiagnosticSource, Version=7.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'. The located assembly's manifest definition does not match the assembly reference. (0x80131040)
File name: 'System.Diagnostics.DiagnosticSource, Version=7.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'
at MySql.Data.MySqlClient.MySqlConnection.OpenAsync(Boolean execAsync, CancellationToken cancellationToken)
at System.Runtime.CompilerServices.AsyncMethodBuilderCore.Start[TStateMachine](TStateMachine& stateMachine)
at MySql.Data.MySqlClient.MySqlConnection.OpenAsync(Boolean execAsync, CancellationToken cancellationToken)
at MySql.Data.MySqlClient.MySqlConnection.Open()
at NewGen.NewGenHelper.MySQLHelper.Tables() in C:\Users\kincs\source\repos\NewGen\NewGenHelper.cs:line 193
at NewGen.NewGen.Main() in C:\Users\kincs\source\repos\NewGen\Program.cs:line 34
FélbeszakítvaKód:
public List<string> Tables()
{
var tables = new List<string>();
using (var conn = new MySqlConnection(ConnectionString))
{
conn.Open();
using(var cmd = new MySqlCommand())
{
cmd.Connection = conn;
cmd.CommandText = "SHOW TABLES;";
var reader = cmd.ExecuteReader().Cast<IDataRecord>();
tables = reader.Select(x => x.GetString(0).ToString()).ToList();
}
conn.Close();
}
return tables;
}Mi okozhatja az exceptiont Linuxon úgy, hogy Windowson nem?
Így fordítottam: dotnet publish -c Release --arch arm --os linuxElőre is köszi
-
martonx
veterán
válasz
rgeorge #9993 üzenetére
.Net 8-nál tartunk. Számomra már az is csoda, hogy VS2022-vel ezek az ősi kódok még futnak. Gyanítom már senki sem teszteli komolyan, hogy újabb és újabb VS-el minden spéci 15-20 éves kód hibátlanul működjön.
Azért én a helyedben küldenék egy github issue-t a fejlesztőknek, hátha nem legyintenek rá, az őskövület kód problémájára. -
rgeorge
addikt
Találtam egy VS 2022 17.6.0-t is egy másik gépen, ott nincs ilyen eltérés. Megnézem majd egy friss telepítéssel is.
-
rgeorge
addikt
Üdvözlet. Frissült a Visual Studio 2022 17.8.1-ra a héten, lehet, hogy ezzel van összefüggésben.
Ha ugyanazt a projektet (.NET Framework 3.5 Console) létrehozom más-más mappában, akkor egészen érdekes különbség lesz.
Az egyikben a debugger ezt mutatja a Main-be lépve:
A másikban meg ezt:
A két mappa között csak annyi a különbség, hogy a másodikban van ékezet is. A második nem csak ebben más, olyan, mintha átváltana C++-ra.
Ebben a mappában sok kis projekt van, sosem volt ilyen gond. Onnan derül ki, hogy debug közben a null értékű objektumok értékét nullptr-ként mutatta.
Találkozott ilyennel már más is? -
cigam
titán
Találkoztatok már ilyennel?
A WEBoldal azt mondja sikeresen bejelentkeztem, de a VS csak nem enged tovább. -
dqdb
nagyúr
válasz
rgeorge #9982 üzenetére
Az ilyet úgy érdemes megoldani, hogy az eredeti XML az alap, az új pedig XDT transzformációkat tartalmaz, azaz kap pár attribútumot, hogy mit kell adott node-dal kezdeni. Bár ez a leírás a web.config-ra vonatkozik, de jól bemutatja a XML módosítási lehetőségeket, a dokumentációját pedig itt találod. Ha pedig egy nem létező típusú transzformációra van szükséged, akkor azt könnyen bele tudod tenni.
Maga a C# kód alapesetben nagyon egyszerű, ezt saját loggerrel és saját transzformációkkal lehet elbonyolítani.
-
Hirtelenjeben pythonra talaltram megoldast:
https://stackoverflow.com/a/32597683update: na itt van ket c#:
https://stackoverflow.com/a/19022895
https://stackoverflow.com/a/29804233 -
rgeorge
addikt
Üdvözlet! Van egy xml fájl, amihez érkezne egy kiegészítő xml, ami azonos struktúrájú, de új ill. megváltozott elemeket tartalmaz (primitív beállítás fájlról van szó).
Sehol sem találtam olyan módszert, ami megbízhatóan tudná merge-lni az új fájlt a régibe. Eddig max. hozzáfűzést tudtam elérni, ahol duplán szerepeltek a módosuló elemek.
C# és .NET Framework 4.8.
Van valakinek ismerete működő megoldásról? -
petyus_
senior tag
válasz
martonx #9980 üzenetére
Köszi, végül megoldódott a dolog. Kipróbáltam a fontot chrome-ban, és nem működött. Kiderült, hogy a chromium nem támogatja az SVG fontot (van egy 10 éves bug
), Firefox amúgy tudja. Viszont támogatja a COLR táblás fontokat, megcsináltam így a fontot, és így már megjelenítette. De közben a bugból megtudtam, hogy a chromium Skia-t használ a rendeleréshez, úgyhogy kipróbáltam a rajzolós appomat, és az is müködik vele. Úgyhogy egyelőre maradok ennél a változatnál.
Köszi az inputot, előtte napokig nem tudtam rájönni mi lehet a megoldás
-
martonx
veterán
válasz
petyus_ #9979 üzenetére
Fogsz egy headless browsert, annak beküldöd a html-t, és csinálsz egy screenshotot az eredményről.
Erre talán a legegyszerűbb megoldás ez: hardkoded/puppeteer-sharp: Headless Chrome .NET API (github.com) -
petyus_
senior tag
Sziasztok!
Elkezdtem egy kis projectet, ami egy kártyakészítő template engine, megadod a kártya nevét, költséget, képet hozzá, szöveg, stb, és szépen megrajzolja.
(egy társasjáték fordítása a cél). Grafikához egyáltalán nem értek, igazából az egész csak meglévő képek, szövegek egymásra illesztése.Használok pár ikont a szövegben, ezeket sikerült beleszerkesztenem a fontba, ligature-ként hozzáadtam, szépen megcsinálja ezt is. Viszont szeretnék színes ikonokat is használni, és itt elakadtam, nem tudom egyáltalán megoldható-e. Tehát azt szeretném, hogy van egy színes svg-m, ezt belerakom egy fontba, csinálok hozzá ligature-t, és szépen legenerálja nekem. Megoldható ez?
A workaroundom sajnos elég melós, ott szavanként rajzolná az egész szöveget, és ha a szó egy ilyen"keyword", akkor beszúrok egy képet. De így sokkal több munka az egész megírása, plusz csomó automatikusan számított dolgot elveszítek (pl szöveg milyen széles, hány sorba fér el, ezeket mind manuálisan kellene számolnom).
Egyébként a SkiaSharpot használom, Harfbuzz extensionnel (ez tud ligature-t, az alap nem).
Van valakinek tapasztalata, tippje?
-
martonx
veterán
Az megvan, hogy amit írsz az nettó hülyeség? Mind a logger, mind a DB esetben?
Dependency Injectionről hallottál már?
De még ha nem is, akkor is hülyeség, amit írsz, ne mondd már, hogy Asp.Net Core-ban folyton újra és újra paraméterezgetni kell a DB-t, meg a Loggert
Vagy akkor valamit őrületesen rosszul kezdtél el, és előbb talán a hivatalos dokumentációt érdemes lenne átfutnod. Asp.Net Core nem is létezik DI nélkül. Akkor meg miről beszélünk? -
Keem1
veterán
válasz
martonx #9973 üzenetére
@martonx és @joysefke
Ahogy látom, mindketten átszervezést javasoltok. Úgyhogy akkor ebbe az irányba kell elindulnom.A logger azért pihent itt. hogy az egész webapp során egyszer kelljen felparamétereznem és könnyebben használhassam.
Az SQLite dettó, a db file természetesen configból jön, igen, nincs hardcodeolva.
Köszi srácok, akkor kicsit átalakítom a kódot.
-
joysefke
veterán
1,
Mi az, hogy "keresztbe példányosítás"?
Ha öröklődéssel hoznál létre egy körkörös dependenciát (származtatott osztály ugye függ az ősosztályától), azt kódszerkesztési időben észrevenné a VS és nem tudsz eljutni oda, hogy futni tudjon a kódod és kivételt kapj mivel le sem forg fordulni. Tehát nem ez a hiba.2,
Tehát akarsz egy ilyet:SQLiteService : CommonService { ...}
Aztán paraméter nélküli konstruktorral szeretnéd példányosítani:
SQLiteService()
Itt kódszervezési probléma van. Az ASP Net Core fő szervezési koncepciója a Dependency Injection. Mivel user kódot írsz és itt most nincsenek egyéb megfontolások ezért ezt az esetedben konstruktorral történő injekciót kéne jelentsen.
A Te SQLiteService osztályod azt állítja magáról, hogy ő nem függ senkitől és semmitől. Ami nonszensz.
Próbáld ki, csinálj egy unit teszt projektet, add hozzá az ASPs projektedet mint függőség és próbáld meg unit tesztből példányosítani és használniSQLiteService
-t.Nyilván nem fog menni, mert szükség lenne az SQLite fájl útvonálára minimum, ami viszont konfigurációból (illene) jöjjön.
3,
Loggolás ugyanez pepitában.ASP-ben a loggolás legegyszerűbb módja DI-jon keresztül van:
Logging in .NET Core and ASP.NET Core | Microsoft LearnSzerintem az a baj, hogy a szervizeidben rejtett, implicit függőségek vannak amelyeket nem derítettél fel.
-
Keem1
veterán
Srácok, logical loopba kerültem
Van egy ASP.Net Core Razor webappom. Próbálom a megértést elősegítendő leírni, mim van:- CommonService, különböző, webapp-wide nyalánkságok, pl. logger, config fileok handlere, konstansok
- SpotifyService : CommonService, Spotify API, a Commonból származtatva, pl. ne kelljen újabb logger instance, stb., ami már a commonban is megvan
- WeatherService : CommonService, kb mint a fenti
- SQliteService.. na itt jön a baj, ebben példányosítottam egy commont: var common = new CommonService();
Szintén azért, hogy pl loggert használhassak
A probléma az, hogy szeretnék SQLite-ot a commonban is, de ha var sqlite = new SQLiteService(); akkor exceptiont kapok, feltételezem, jogosan, a keresztbe példányosítás miatt.Tudom, hogy kb a logikával ellentétes dolgot akarok, deee ...
Hogy tudnék mégis egy SQLiteService instancet létrehozni? -
De ha nem akarsz osztalyokat, akkor siman egy JSON-ba berakhato az egesz es lehet ezek alapjan kezelni:
https://stackoverflow.com/a/72126357
vagy
https://stackoverflow.com/a/3806407 -
savior
őstag
válasz
quailstorm #9967 üzenetére
Köszi. Megnézem.
-
quailstorm
félisten
Objektum-orientáltság, öröklődés erre jól ráhúzható.
Fegyver interfész, vagy absztrakt osztály virtuális függvényekkel és azt implementálod az egyes fegyvertípusok szerint.
-
savior
őstag
Helló.
Unity-t használok, amiben c# van.
Sokmindent letudok benne kódolni, de van egy része, ami nekem annyira nem megy.
Régen lpc nyelven programoztam mud-ot, és ott valahogy így lehetett eltárolni az adatbázist: mapping mp = ([ "fegyverek" : ([ "fakard" : ([ "sebzes" : 1, "tipus" : "vago" ]), "buzogany" : ([ "sebzes" : 2, "tipus" : "zuzo"]) ]) ])
És utána az mp["fegyverek"]["fakard"]["sebzes"] visszaadta, hogy 1.
Namost ez én jelenleg úgy tárolom unityben, hogy string[] fegyverek és megadom a fegyverek neveit, aztán egy másik string[] -ben elhelyezem a tipusukat, egy harmadikban a sebzest. Lekérdezéskor pedig fegyverek[0], tipus[0], sebzes[0] -val mondjuk az elso fegyver értékeit lekérem.
Szerintem a mostani módszerem nem túl stílusos, habár működik. Hogy tudnám ezeket az adatokat a legjobban eltárolni/lekérdezni? -
válasz
ReSeTer #9964 üzenetére
Ha c# List-ről van szó, akkor a RemoveAt metódus eltávolítja a paraméterben megadott indexen lévő lista elemet a "helyével" együtt, tehát újra is méretezi a listát és az eltávolított elem utáni elemek indexe is változik természetesen. Ha eleve sorba voltak rendezve, akkor az a növekvő / csökkenő sorrend továbbra is megmarad.
-
ReSeTer
senior tag
Helló!
Van egy listám különböző számokkal. Abból a listából én törlök véletlenszerűen. Hogyan lehetne ezt a listát újrarendezni úgy, hogy csökkenő legyen, és sorba legyenek üres hézag nélkül? Tehát újrarendezésről is lenne szó.
Van erre külön gyári method? Gondolom a sima sort funkciók csak sorba rendezik és ott maradnak az üres helyek is feleslegesen.Lehet hülyeséget kérdezek, mert most azon gondolkozok, hogy ha törlök akkor a többi szám ID-ja is megváltozik?
Kezdő vagyok.
-
joysefke
veterán
WindowsIdentity-vel kapcsolatban szeretnék segítséget kérni. Nem értek hozzá, eddig nem kellett ezzel foglalkoznom. Világítsatok rá, ha valami valahol technikailag nem megoldható.
1, van egy applikáció ami egy lokál service account "LOCALPC\MyService" nevében fut.
ennek az accountnak igény szerint tudok jogosultságokat adni.2, Elő kell állítanom egy WindowsIdentity objektumot ami egy domain usert személyesít meg: DOMAIN1\Pisti . Ezt a WindowsIdentity objektumot egy belső API használja. Úgy gondolom, hogy nem imperszonálásra, csupán a usert érintő AD security releváns információk megnézésére. Ebben nem vagyok biztos.
3, Az applikáció rendelkezik a domain admin user/pwd párosával "DOMAIN1\Administrator" + Pwd (igen, ez már eredetileg egy ilyen applikáció
) Pistiével és a többi userével viszont nem.
Tehát szeretnék DOMAIN1\Pistike nevére előállítani az applikációban egy WindowsIdentity objektumot.
Nem tudom, hogy ez egyáltalán lehetséges-e.
4, Létezhet-e WindowsIdentity objektum a LOCALPC-n DOMAIN1\Pisti nevére anélkül, hogy a LOCALPC a DOMAIN1-ben lenne? Jelenlegi környezetemben a LOCALPC bent van a domainben, de az appot futtató account nincsen.
5, Hogyan tudom megvalósítani? Nem akar összejönni, bár ez nem csoda, mert nincs vele tapasztalatom?
Azt látom, hogy ha "DOMAIN1\Administrator" futtat kódot, akkor
new WindowsIdentity(string: DOMAIN1_Pisti_upn)
konstruktorral tudok érvényes és az app számára használható WindowsIdentity objektumot létrekozni. Pisti nevére Pisti pwd-je nélkülAz is működik, hogy LOCALPC\MyService futtatja a kódot és bejelentkezteti a DOMAIN1\Administrator-t username/pwd-vel
advapi32.dll.LogonUser(lpszUsername, lpszDomain, string lpszPassword, dwLogonType, dwLogonProvider, out phToken)
-en keresztül. Itt végül visszakapok egy WindowsIdenity a DOMAIN1\Administrator nevére és úgy tűnik, hogy imperszonálásra is tudom használni, de anew WindowsIdentity(string: DOMAIN1_Pisti_upn)
hívás így is elbukik. Az alábbi hibaüzenettel:Error Message: Test method ApiSandbox.ImpersonationSandbox.Test2 threw exception: System.DllNotFoundException: Unable to load DLL 'secur32.dll': Either a required impersonation level was not provided, or the provided impersonation level is invalid. (Exception from HRESULT: 0x80070542) Stack Trace: at System.Security.Principal.WindowsIdentity.KerbS4ULogon(String upn, SafeAccessTokenHandle& safeTokenHandle) at System.Security.Principal.WindowsIdentity..ctor(String sUserPrincipalName, String type) at System.Security.Principal.WindowsIdentity..ctor(String sUserPrincipalName) at ApiSandbox.ImpersonationSandbox.Test2() in C:\...\ImpersonationSandbox.cs:line 48
Az eleje, az "Unable to load DLL 'secur32.dll'" biztosan nem stimmel. Ugyanazt a tesztkódot domain-adminként elindítva lefut.
Van ezzel a témával kapcsolatban valami jó anyag?
-
bandi0000
nagyúr
Igen igen, ez volt a key point... Visual studion belül talàn server object explorer , vagy micsida is a neve, ha azon keresztül töröltem, akkor jó volt..szal én csesztem el de most már megvan, köszi
-
petyus_
senior tag
válasz
bandi0000 #9959 üzenetére
Milyen dotnet verziót használsz? Az EnsureCreated az EntitifyFrameworkCore-ban van, amit te használsz az meg sima EF.
EnsureCreated
CreateIfNotExists -
bandi0000
nagyúr
válasz
petyus_ #9958 üzenetére
Köszi, viszont ilyen metódust nem találok, valszeg más verziót használok... Amúgy EF6-ot
Program.cs-ben meghívtam a Database.createIfNotExiststs() fv-t, először létre is hozta szépen, aztán bezártam a studiot és kitöröltem az adatbázis fájlt. Megnyitottam és megint nem hozta létre, mitöbb olyan, a Database.Exists() fv-ny ius true-val tér vissza. Olyan mintha be cachelné magának vagy nem is tudom, ezután a hibaüzenet már egyértelmű:
SqlException: Cannot open database "..." requested by the login. The login failed.
Login failed for user -
petyus_
senior tag
válasz
bandi0000 #9957 üzenetére
dbContext.Database.EnsureCreated()) létrehozza neked a DB-t, ha nem létezik. Meghívhatod akár constructorban is, de érdemesebb kiszervezni, és mondjuk IsDevelopment esetén meghívni.
Program.cs-ben mondjuk így tudod megoldani:
if (app.Environment.IsDevelopment())
{
using var scope = app.Services.CreateScope();
var services = scope.ServiceProvider;
var db = services.GetRequiredService<DbContext>();
db.Database.EnsureCreated();
}
Ha nem akarsz migrationökkel foglalkozni, akkor az EnsureCreated előtt meghívhatod az EnsureDeleted()-et is, így mindig törli/létrehozza a DB-t. (nyilván ezt prodban ne csináld)
-
-
martonx
veterán
válasz
bandi0000 #9953 üzenetére
Ha Auto Migration kell, akkor a program.cs-be érdemes rakni egy ilyet:
//Auto migration
using var serviceScope = (app as IApplicationBuilder).ApplicationServices.GetRequiredService<IServiceScopeFactory>().CreateScope();
using var context = serviceScope.ServiceProvider.GetService<ApplicationDbContext>();
await context!.Database.MigrateAsync(); -
bandi0000
nagyúr
Na nagyjából kész lettem, viszont elég hektikusan működik az adatbázis...
Code first megközelítést használtam, modellek db context kapcsolatok, és használtam migrációt.
Szóval kész lett az adatbázis része, ráhívtam az enable-migrationst és add-migrations init -et
A gond az, hogy töki hektikusan elindítom és kiírja, hogy az adatbázist létrehozta már stb hiba, aztán kitörlöm az adatbázist és azt írja, hogy login nem ment valszeg mert nem találja az adatbázist
Mit szúrhatok el? szerintem kevertem valamit és emiatt van kavarodás benne is...
Azt szeretném, hogy ha még nincs adatbázis, akkor hozza létren, és ha valaki lehúzza a repot, akkor neki se kelljen trükközni, csak indít és megy
+1, ha kiírja a login hibát, akkor változtatok a DB néven, és megint jó
DbContext releváns rész:
public DbContext() : base("name=DbConnectionString")
{
System.Data.Entity.Database.SetInitializer<DbContext>(new CreateDatabaseIfNotExists<DbContext>());
}AppConfig:
<connectionStrings>
<add name="DbConnectionString"
connectionString="Data Source=(LocalDb)\MSSQLLocalDB;Initial Catalog=Db;Integrated Security=true;MultipleActiveResultSets=True"
providerName="System.Data.SqlClient"/>
</connectionStrings> -
petyus_
senior tag
válasz
bandi0000 #9950 üzenetére
Ahol lehet, érdemes async metódusokat használni (mondjuk egy saját használatra szánt webappnál nem valószínű, hogy észreveszed a különbséget, de egy desktop appnál ha nem async-ot használsz, akkor a mentés idejére megfagy a UI)
A validálással kapcsolatban, én főleg webes alkalmazásokon dolgozom, desktop appot soha nem csináltam még, így nem tudom ott hogy szokták megoldani. Weben általában amit lehet, már a UI-on validálunk egyből, ettől függetlenül a szerveren ugyanúgy még egyszer validálunk.
Biztos van valami event winformsban, amire fel tudsz iratkozni (mondjuk amikor a kurzor elhagyja az input boxot), itt meg tudsz csinálni minden validálást, és submitkor már valid lesz minden adat. Esetleg akkor validálnék újra a service-ben, ha valamelyik field mondjuk már meglévő adatoktól függ, és ez változhat közben.
-
bandi0000
nagyúr
Köszönöm mindenkinek a magyarázásokat.Kezd kialakulni bennem, hogy mit is, hogyan csinálok.
Azt hiszem Windows Forms projekt ez, jól gondolom, hogyha UI osztály hívja majd az én pl CarService osztályomat, ott a DB mentést async kell csinálni?
Illetve ha van akkor a CarService-ben egy saveCar metódus, ebben a rétegben lehet alap ellenőrzéseket csinálni? Vagy itt már feltételezhetem, hogy mindennek van értéke, ami a felületről jön
-
joysefke
veterán
válasz
bandi0000 #9945 üzenetére
Ahogy már írták a DbContext már önmagában is repository és unit of work.
Innen kezdve ha becsomagolod egy generikus repository + UoW absztrakcióba, akkor azt nem a funkcionalitás miatt teszed, hanem hogy elfedd a EntityFramework-öt, tehát hogy a repositoryt használó kód ne tudja magát az adott EfCore verzióhoz/funkciókhoz láncolni.
akkor van valami köztes réteg még a felület és az adatbázis közt, ami pl olyan feladatot látna el, hogy mentéskor ha ügyfelet és autót akarunk menteni, akkor a felületen kb csak annyi hívás legyen, hogy: SaveClientWithCar(Client client, Car car) és ez a köztes réteg lezongorázza a mentéseket ID generálással és beállítással?
Igen, a repository egy low level absztrakció az adathozzáférési rétegben.
Ha van egy featuröd (amit mondjuk egy UI page valósít meg) akkor annak a featurenek lesz konkrét igénye hogy adatokat tudjon olvasni a DB-ből (amit megjelenít a user számára) illetve a user által módosított adatokat perzisztálni tudja DB-be.
Az adatok formájára nézve a feature nyilván konkrét kívánalmakat fogalmaz meg. (e.g. mutasd az összes usert akinek van autója az autója típusával és évjáratával együtt) illetve meghatározza, hogy melyik adatmorzsa módosítható és melyik nem a feature kontextusában.Itt érdemes egy a featuret kiszolgáló, a repositorynál magasabb absztrakciós szinten lévő, data access service osztályt definiálni ami a repositoryra támaszkodva keríti elő a featuret hajtó kód számára az adatokat illetve menti el a változásokat. A repository-ból visszaadott adatokat arra a formára tudja adaptálni amilyen formában a featurnek szüksége van rá.
egy alternatíva lehet, hogy hagyod a repository patternt és ezeket az adott featuret kiszolgáló data access service osztályokat közvetlenül az Ef DbContext-re építed (DI-t használva nyilván) aztán a featuret hajtó logika használja ezeket (ezek interfészét).
-
petyus_
senior tag
válasz
bandi0000 #9947 üzenetére
Attól függ, hogy definiáltad a kapcsolatokat. Ha használtad a virtual keyword-öt, akkor Lazy loading-ot használ, ez azt jelenti, hogy ha valahol használod az adott property-t, akkor ott fogja betölteni, egyébként nem. Ha nem használod a virtual-t, akkor csak akkor tölti be, ha használod az Include-ot.
Egyébként szerintem érdemes kikapcsolni a lazy loadingot (vagy mindehol elhagyod a virtual-t, vagy a context constructorában Configuration.LazyLoadingEnabled = false;). Ha mondjuk egy ciklusban végigmész a parent entity listán, és azon belül eléred a child entity-t, akkor annyiszor hívja meg a db-t, ahány elemed van a listában. Ez eléggé be tudja lassítani a dolgokat, szerintem jobb ha expliciten megadod az Include-ot ahol kell, máshol meg ne töltse be.
-
bandi0000
nagyúr
válasz
petyus_ #9946 üzenetére
Köszi, igen már közben rájöttem, hogy az járható út... Viszont lehet hülyeséget kérdezek, vagy benéztem valamit, de ha a DbContext osztályban, definiálom a kapcsolat típusát, pl létrehozom a táblák közti 1-N kapcsolatot, akkor viszont nem kell használni az include-ot, vagy igen? Mert jelenleg nem használtam mégis ott volt a car a user-en belül
-
petyus_
senior tag
válasz
bandi0000 #9944 üzenetére
A táblák összekapcsolását navigation property-kkel oldod meg Entity Framework alatt. Van egy User tábla, egy Car tábla, a User class-on csinálj egy Car property-t. Így ha le akarod kérni a Usernek a Car-ját, azt pl úgy tudod, hogy
context.Users.Where(u => u.Id == id).Include(u => u.Car)
(ha nem hívod meg az include-ot, akkor alapból azokat az adatokat nem tölti be)
Ez ugyanígy működik a másik irányban is, ha Usert (Clientet) akarsz menteni Car-ral együtt, akkor legyen egy User objektumod, amin van egy Car property,
context.Users.Add(user)
context.SaveChanges()
és elmenti a Car-t is.
De ha sokszor akarod használni a Car-t, akár Usertől függetlenül, akkor érdemes csinálni egy CarRepository-t, és azon keresztül dolgozni(mondjuk arról is folyton megy a vita, hogy EntityFramework-ot használva kell-e még külön repository, mivel a DbContext már maga egy repository, meg unit of work)
-
bandi0000
nagyúr
válasz
bandi0000 #9944 üzenetére
+1
Ha ez a UnitOfWork jó dolog, és így kell működnie, akkor van valami köztes réteg még a felület és az adatbázis közt, ami pl olyan feladatot látna el, hogy mentéskor ha ügyfelet és autót akarunk menteni, akkor a felületen kb csak annyi hívás legyen, hogy: SaveClientWithCar(Client client, Car car) és ez a köztes réteg lezongorázza a mentéseket ID generálással és beállítással? -
bandi0000
nagyúr
Sziasztok,
Lenne pár kezdő kérdésem
Elvállaltam egy beadandó elkészítését, igaz csak az adatbázis részt kell.
Kicsit ott vagyok elakadva, hogy nincs sok tapasztalatom C#/Entity framwork architectura kialakításában, találtam ezt a [Unit of work] csodát, ami egész szimpatikusnak tűnik, viszont az én elképzelésemben a Repository-k tartalmazzák a konkrét lekérdezéseket, amit értek ezalatt:
Pl van egy Users osztály meg nem tudom Cars, külön külön van repository mindkettőnek CRUD műveletekre, aminél ez a unit of work működik is. De mi van, ha össze kell kapcsolni 2 táblát? Annak kellene egy új repository, vagy valamelyik meglévőbe, pl Users-be belerakni a lekérdezést? Csak akkor már nem működik ez a UnitOfWork...
Kis kontexus, Android fejlesztő vagyok, és ott ugye MVVM van, Repository tartalmazza a konkrét lekérdezéseket pl getUsersWithCars és a felület csak azt hívja, és ő már nem végez rajta műveletetet
Vagy igazából ez teljesen felesleges, mert ugye a kapcsolatok miatt, a Users fogja tartalmazni a Car list-et, és akkor majd a felületen szétválasztják?
-
martonx
veterán
Úristen a razor pagestől a mai napig kiver a víz. Php-ról áttérők miatt került bele a keretrendszerbe. Egyébként teljesen rosszul kezdtél neki, előbb doksit kellene olvasnod, nagyon jól le van írva az ASP. Net Core identity tutorialokkal. Fórumokban kérdezgetés, meg vakon neki esés helyett:
1. Doksi olvasás
2. Doksiban lévő tutorialok végig nyomásaMajd ha ezek után még van kérdés, szívesen segítek. Jól választottál ASP. Net Core-al, php után Trabant - Mercedes a különbség.
-
Keem1
veterán
válasz
martonx #9941 üzenetére
Igen, vmi ilyesmi (leegyszerűsítve).
Az ASP.Net-et még csak most kezdtem el behatóan tanulmányozni, mivel az előző melóhely óta (idestova 4 éve) nincs szükségem igazán PHP-re, C#-ra viszont igen, így arra gondoltam, a webes tudásomat is .NET alapokon kamatoztatom, tekintve hogy a .NET 6 + ASP.Net Razor már frankón megy linuxon is (Apache mögött), így megvan minden téren az érdeklődés.namespace LearnASPNETCoreRazorPagesWithRealApps.Pages { public class IndexModel : PageModel { [BindProperty] public string Username { get; set; } [BindProperty] public string Password { get; set; } public string Msg { get; set; } public void OnGet() { } public IActionResult OnPost() { if (Username.Equals("abc") && Password.Equals("123")) { HttpContext.Session.SetString("username", Username); return RedirectToPage("Welcome"); } else { Msg = "Invalid"; return Page(); } } } }
-
Keem1
veterán
Srácok, mennyire jó ötlet sessionnel loginolni? PHP-érában azt szoktam meg, de látom, ASP-ben van vmi saját auth megoldás is. Mennyire obsolete vagy unsecure a sessionös login manapság?
-
Keem1
veterán
válasz
martonx #9937 üzenetére
Deee, az.
Még nem jöttem rá a megoldásra, de keresem..
Kicsit más: hogy tudok egy foldert buildeléskor az exe mellé tenni? Van egy www nevű folder, pár HTML template-tel, és azt is be kéne tennie fordításkor/publishkor oda, ahova a többi file megy.
Túrom a StackOverflow-t, de még nem találtam rá megoldást.
Ja, ez már nem ASP.Net, hanem Net 6.0 service -
Keem1
veterán
Még egy kérdés az ASP.Net Core Razor dologban.
Adott egy view (Proba.cshtml), és benne egy@using tesztnamespace
A view-ban, ha az adott namespaceből (tesztnamespace.tesztclass.tesztmethod()
) valamit használnék, ezt kapom: tesztmethod is inaccessible due to its protection level.
Miért?
Modelből simán megy, viewből nem.Szerk: ja, igen, mind a class, mind a method public.
-
joysefke
veterán
ezeket próbáltad?
WebApplication and WebApplicationBuilder in Minimal API apps | Microsoft LearnMásik opció hogy appsettings.json-ban definiálod a portot.
-
Keem1
veterán
Srácok, ASP Net Core 7, hello world app... 🙈
Hol tudok konkrét portot definiálni (a default :5000 helyett) aProgram.cs
-ben az app.Run(); előtt?
Gugliztam egyapp.UseUrls()
-t, de aWebApplication
classnek nincs ilyen metódusa.Köszi
-
a ket form az ket kulon objektum, ugy tudsz egymas adataihoz hozzaferni, hogy az egyik formnak odaadod a masik objektum hivatkozasat es akkor a publikus elemeihez hozza tudsz ferni. Persze ha a form elemek private-nak vannak deklaralva akkor nem fog menni - de most nem remlik, hogy mi az alapbeallitas.
Progress kozben at tudsz adni barmilyen erteket, legyen az egy egyzeru valtozo, struktura vagy komolyabb objektum. A dowork fuggvenyben kell meghivnod a ProgressChanged esemenyt es atadni neki az aktualis allapotot (vagy amit kozolni akarsz az esemenyt lekezelo oldallal). -
Alu
senior tag
válasz
quailstorm #9923 üzenetére
& joysefke
Köszönöm a válaszokat!
Async Taskkal próbálkoztam, de pingelés során ugyan úgy megfagyasztotta a UI -t. Backgroundworkerrel még csak ma kezdtem el ismerkedni, készítettem hozzá egy új projektet teszteléshez és eddig egész jónak tűnik.
Abban tudnátok segíteni, hogy a DoWork függvényből hogyan tudom több változó értékét átvinni a ProgressChanged függvénybe? Találtam egy megoldást, ami az e.Result -ba teszi bele egy osztálynak az elemeit, majd a Completed függvényben veszi ki az e.Result -ból. A problémám ezzel, hogy nekem a ProgressChanged fv. -ben már kellenének ezek az értékek, de itt az e.Result -ra hibát kapok.Az mennyire barkács megoldás, ha létrehozok egy struktúrát és a struktúra elemein dolgozok a DoWork fv. -ben, majd amikor meghívásra kerül a ProgressChanged, akkor felhasználom a struktúra változóinak értékeit?
Illetve még egy olyan kérdésem lenne, hogy létrehoztam egy másik formot, ahol a csatlakozás beállításait szeretném módosítani. A két form között milyen megoldással tudom kicserélni a változók értékeit? Pl. Ha a Settings_Form -on beírok egy új IP címet, az hatással legyen a MainForm osztályban lévő IPAddr változóra is.
-
joysefke
veterán
Nem párhuzamosítást, hanem asszinkronitást keresel. A UI-ok általában úgy működnek, hogy egyetlen, dedikált szál tudja a UI-on lévő controllokat updatelni, minden más szálból (pld egy background thread) történő update exceptiönnel végződik.
Ha a UI -threaden blokkolsz (a UI event által triggerelt kód nem másik threaden fut, vagy a UI threadet kényszeríted IO-ra várakozásra) akkor megfagy a UI egészen addig amíg a UI thread fel nem szabadul.
Arra hogy hogyan tudod a munkát egy másik szálra átvinni majd az eredményt a UI threadnek visszaadni arra a Task-Async-Pattern (async -await) való. Vannak más régi megvalósítások is. Keress async-await példát, elég egyszerű a használata.
(Nincs dolgom UI-al, de ez kb általános kell legyen, tehát a Winforms-ra is vonatkozik).
szerk:
A fent említett IProgress is egyébként egy ilyen megvalósítás. A progress reportot átküldi a UI threadre -
quailstorm
félisten
A BackgroundWorker az egy jó pattern erre.
Ugyan ez WPF de itt is szépen el van magyarázva.Ha simán csak egy UI változót kell pörgetni akkor pedig az IProgress egy jó pattern. [link]
-
Alu
senior tag
Sziasztok!
Készítettem egy Windows Forms App -ot, amivel egy ubuntu alapokon lévő "házi szerver pc" -t szeretnék néhány egyszerű funkcióval vezérelni/státuszt lekérdezni. Ezek a következők lennének:
- Szerver pc pingelése
- Wake on lan küldése a szerver pc -nek (mac alapján)
- Ssh -n keresztül bejelentkezés, illetve parancs küldés és fogadás (egyenlőre rsync és shutdown parancsok lennének)Addig eljutottam, hogy létrehoztam egy Win Form App -ot, elkészítettem a felhasználói felületet és megírtam az összes függvényt, ami a fenti funkciókhoz szükségesek. A funkciókat az UI -on lévő gombokkal lehet elindítani és a függvények logolják egy multiline text boxba, hogy milyen szekvenciák futottak le, vagy éppen milyen válasz jött vissza ssh -n. A program egész jól működik azzal a szépséghibával, hogy amíg a háttérben futnak a függvények, addig az UI teljesen megfagy. Ez nem is lenne akkora probléma, de van, hogy az rsync parancs hosszú percekig, akár egy óráig fut, mire megjön a report, hogy mit sikerült szinkronizálnia. Ennek orvoslására ki szeretném rendezni a függvényeket külön szálba, hogy legalább az asztalra le lehessen tenni az UI -t és ne "Nem válaszol" státuszba kerüljön, amikor véletlenül rákattintok. A kiszervezésnél addig jutottam, hogy létrehozom a párhuzamos szálat, de amint abból a szálból szeretnék egy a fő formon lévő komponensre (pl. label, button, stb.) hivatkozni vagy annak értéket beállítani, egyből "Szálak közötti művelet érvénytelen" hibát kapok. Ezt egy logolást végző függvénynél már sikerült feloldanom Invoke használatával, de egy buttonEnable beállításnál újra előjött.
A kérdésem az lenne, hogy ezt az Invoke -os megoldást minden egyes komponensnél el kell játszani vagy van erre valami egyszerűbb út, amire még nem sikerült rátalálnom?
Eddig jellemzően mikrokontrollereket programoztam C -ben, a Win Forms, C# és oop teljesen újak számomra, de nagy a motiváció.Minden segítséget előre is köszönök!
-
CPT.Pirk
Jómunkásember
válasz
joysefke #9920 üzenetére
Nincs és igazából soha nem is volt főállású .NET fejlesztőnk.
Mi hw fejlesztők vagyunk akik programoznak is, ebben a vonatkozásban meg jellemzően ha van is OS, akkor az nem Windows.
Mondjuk ezek a .NET-es progik belsős progik, saját használatra. Szóval belefér, hogy nem tökéletes, csak működjön.
-
joysefke
veterán
válasz
CPT.Pirk #9919 üzenetére
A projekt számára hatalmas pozitív lépés lenne, ebből a TryPop hozzáadott értéke szerintem nulla.
Egy üres konzol projektet triviális upgradelni NET6-ra, (átírsz a csproj-ban egy sort) egy nagy applikációt viszont nem lesz ilyen egyszerű.
Ha van .NET fejlesztő aki ezt főműsorban fejleszti, azt meg lehetne kérdezni, hogy ez miért nem történt még meg.
-
CPT.Pirk
Jómunkásember
válasz
martonx #9918 üzenetére
Zsír, megnézem majd ha "kapok időt" ezzel foglalkozni a melóban. Azon kívül, hogy lesz TryPop(), jelent nekem valami előnyt az újabb .Net-re átváltás? Mert ha nem, akkor nem biztos, hogy érdemes.
Én egyébként leginkább Lazarushoz vagyok szokva, ott bonyolultabb GUI-s appokat is csináltam de ilyennel nem kellett foglalkozni, viszont mégis csak pár megás binárisokat fordított maximum, ráadásul ezt multiplatform tudta, azonnal tudtam Linuxra is fordítani ugyanazt a kódot.
-
martonx
veterán
válasz
CPT.Pirk #9917 üzenetére
Ez esetben van egy jó hírem: Most gyorsan kipróbáltam .Net 7-tel. Ezek voltak a beállításaim a csproj file-ban:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net7.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<PublishSingleFile>true</PublishSingleFile>
<SelfContained>true</SelfContained>
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
<PublishReadyToRun>true</PublishReadyToRun>
<PublishTrimmed>true</PublishTrimmed>
</PropertyGroup>
</Project>Lelövöm a poént 14Mb-os lett a dotnet publish után előálló .exe file-om, amiben benne van a szükséges runtime is. Igaz, hogy ez csak egy console app.
"másik nyelvnél még ilyen megoldással nem találkoztam" - nincs hátránya, hacsak az nem, hogy ilyenkor kötelező előre megmondanod, milyen OS-t célzol meg. Más nyelveknék előbb telepítened kell a runtime-ot, és majd csak utána tudsz bármit futtatni. A .Net eléggé király ezzel, hogy vinni tudja magával a minimálisan szükséges runtime-ot (gyorsan tegyük hozzá, hogy ez csak console appokra igaz cross platform szinten, nem cross-platform szinten windows only feature).
-
CPT.Pirk
Jómunkásember
válasz
joysefke #9914 üzenetére
Jah, marad a 4.8 elsőre, mert az van alapból W10-en.
Unit teszt... hmm jah. Az a baj, hogy egyébként nem vagyok programozó, és melóban meg annyi az egyév projekt, hogy csak ritkán tudok ezzel foglalkozni, de közben meg kéne használni...
A programozás az nálam hardveresként csak jött a meló mellé, de akkor meg jellemzően beágyazott C, némi C++/QT, de leginkább Lazarus alatt freepascalban.
-
joysefke
veterán
válasz
CPT.Pirk #9911 üzenetére
Ilyenkor mi van?
Használod a Peek-etvagy updatelsz .NET 6-ra (Standard 2.1-re)
Netes példákban én is láttam ezeket, de nem írták, hogy valamit kellene hozzájuk bekapcsolni.
1,
A MS-nak egész jó online C# / .NET doksija van /learn.microsoft.com/. Első körben, ha full homály valaminek a működése, akkor azt érdemes megnézni.
Queue<T>.Peek Method (System.Collections.Generic) | Microsoft LearnA bal felső sarokban a drop-downból ki is tudod választani, hogy mi a target framework verziója.
2,
Sajnos nem készült dokumentáció a kódról pár soros szösszeneteken túl, így a "mire gondolt a költő" helyzet van mikor nézem mi lehet a gond.Ha ténylegesen meg kell értened hogy mit csinál az a metódus amit belinkeltél, akkor mivel tiszta függvénynek tűnik és fontos logikát kódol (tehát minimális befektetéssel tudsz hasznos tesztet írni), ezért a legjobb amit tehetsz, ha írsz rá unit-teszteket, azt könnyű futtatni, debuggolni, ezért egyszerre tudod megérteni és kikupálni a függvényt.
Ehhez persze az kéne, hogy a unit teszt vagy elérje a metódust /A/ vagy a metódus ne az osztályban legyen deklarálva /D/, vagy objektumként /B/ vagy delegate-ként /C/ átadva, így tesztelhetővé válik.
-
CPT.Pirk
Jómunkásember
válasz
quailstorm #9912 üzenetére
.Net 4.8
Win 10-es gépekre van tervezve a progi, ez meg azt hiszem van alapból. -
CPT.Pirk
Jómunkásember
válasz
joysefke #9908 üzenetére
Jaa, még ha tudnám minek kell ebből kijönnie. Sajnos nem készült dokumentáció a kódról pár soros szösszeneteken túl, így a "mire gondolt a költő" helyzet van mikor nézem mi lehet a gond.
Amúgy nálam nincs semmilyen Try-os lehetőség, se TryPop, se TryPeek. Ilyenkor mi van? Netes példákban én is láttam ezeket, de nem írták, hogy valamit kellene hozzájuk bekapcsolni.
-
CPT.Pirk
Jómunkásember
Ohh yeah, a Count() ellenőrzés jó lett. Erre én is gondoltam tegnap, csak akkor a while feltételeinek végére írtam és úgy nem volt hatása.
Így már fasza. Köszi a segítséget!
while (s1.Count() > 0 && s1.Peek() != "&&" && s1.Peek() != "||")
-
joysefke
veterán
válasz
CPT.Pirk #9904 üzenetére
A leírásod arra utalt, hogy még "látod", hogy van benne elem és úgy dob exceptiönt.
Debug buildben látnod kellett volna a ciklus fején a feltétel ellenőrzése előtt hogy üres a stack -kurzort fölé viszed-.Ha az a baj, hogy kifogyott a Queue, akkor éppen berakhatsz egy (Count > 0) && -t a feltétel elejére vagy Peek() helyett TryPeek(out string)-kel dolgozol.
if (s1.TryPeek(out string item) && item != "&&" && item !="||" )
{
s1.Pop();
}
-
quailstorm
félisten
válasz
CPT.Pirk #9904 üzenetére
Igen, így van. A Peek üres stack esetén exceptiont dob. Szóval az utolsó pop után a következő feltételellenőrzés a while-ban exception, nem pedig false. A Count ellenőrzése jó lesz.
-
CPT.Pirk
Jómunkásember
Igen, debug build optimization nélkül.
Viszont, a while ciklus a probléma forrása:while (s1.Peek() != "&&" && s1.Peek() != "||")
{
s1.Pop();
}
Úgy gondolom az történik, hogy mikor a Pop(); kiszedi az utolsó elemét a stacknek, akkor azzal megölte magát a while-t is. ?megszűnt a ciklus változó?Azért gondolom ezt, mert a "hagyományos" módon meg működik ugyanez:
int j = s1.Count();
while (j > 0)
{
if ((s1.Peek() != "&&") && (s1.Peek() != "||"))
{
s1.Pop()
}
else
break;
}
Ez így jónak tűnik. Ugyanakkor a kód további részét ebben az ágban majd át kell írnom, de az már más kérdés.
-
CPT.Pirk
Jómunkásember
válasz
joysefke #9900 üzenetére
Egy CAD program projektjéhez tartozó kiexportált szabályrendszert tartalmazó szövegfájlt dolgoz fel és jeleníti meg grafikusan. Ez az ága a programnak nem volt korábban használva, mert egy bizonyos szabály típusnál fut csak ide, ami tartalmazza a % jelet és ilyen nem volt korábban.
A 43-as sorban lévő Pop() okozza az exceptiont. [link]
Amikor odaér a kód a 42-es sorhoz a while-al miután betöltöttem a fájlt, akkor a Count() értéke 2 és benne is van két szöveg részlet a fájl első sorából a debugger szerint.
A while egyszeri lefutásával elsőre lemegy a Pop(), a Count módosul 1-re de a következő körben mégis exception jön. Akkor is, ha ott a Pop() helyett Clear() van, arra is elszáll.Azt hiszem nincs több szálasítva a program, de bővebben egyenlőre nem ismerem a működését.
Hogy ez a Stack dolog miért jó azt nem tudom, én stringlist dolgokkal szoktam szövegeket kezelni de C# alatt még nem programoztam.
Új hozzászólás Aktív témák
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!
- Gigabyte X299 UD4 Pro LGA 2066 alaplap, i7-7820X proci, 64 GB DDR4-3200 MHz RAM
- Dell Alienware AW3423DWF Oled 165HZ Gamer Monitor (garis)
- Bomba ár! Lenovo ThinkPad Yoga X380 - i7-8G I 16GB I 256SSD I 13,3" FHD Touch I Cam I W11 I Gari!
- Bomba ár! Lenovo ThinkPad T590 - i5-8GEN I 16GB I 256GB SSD I 15,6" FHD Touch I Cam I W11 I Gari!
- Bomba ár! Lenovo ThinkPad T15 G1 - i7-10GEN I 16GB I 512GB SSD I 15,6" FHD I Cam I W11 I Gari!
- DELL Precision 7730 i5-8400H Quadro P3200 16GB 512GB FHD 17 1 év garancia
- Nvidia Setup! Kamatmentes rèszletre is!
- Csere-Beszámítás! Garancia! Steam Deck LCD 512GB + 256GB Ajándék Micro SD Kártya!
- MS SQL Server 2016, 2017, 2019
- ÁRGARANCIA!Épített KomPhone Ryzen 5 7600X 32/64GB RAM RTX 5070 12GB GAMER PC termékbeszámítással
Állásajánlatok
Cég: FOTC
Város: Budapest