m4a_X

[Guide] EntityFrameworkCore | Wie nutze ich es richtig?

Recommended Posts

Hallo allerseits!

Ich selber habe lange damit zugebracht zu schauen wie ich EntityFrameworkCore möglichst so nutzen kann wie EF6 (EntityFramework 6).
Nach einer langen Zeit auf Google habe ich es mittlerweile auf eine recht einfache Art hinbekommen, die so jeder übernehmen kann.

Ich spare mir die meisten Erklärungen, ich zeige die Schritte die ihr anwenden müsst.
Inkompatibilität wenn schon andere MySQL Packages installiert sind, kann durchaus vorkommen, bitte vorher löschen.

 

Erster Schritt

Ladet folgende NuGet Packages herunter

Microsoft.EntityFrameworkCore
Microsoft.EntityFrameworkCore.Tools
Pomelo.EntityFrameworkCore.MySQL
Pomelo.EntityFrameworkCore.MySQL.Designer

Der zweite Schritt

Jetzt müsst ihr eurer Projekt entladen, und dann die CSProj Datei bearbeiten.
Dort fügt ihr einfach folgende zwei Informationen ein:

GenerateRuntimeConfigrationFiles ist ein Workaround was den Fehler behebt wenn er beim Datenbank-Model erzeugen den Net.Core nicht finden kann.
Tools.DotNet... benötigen wir damit wir (dotnet ef...) nutzen können.

<PropertyGroup>
    <GenerateRuntimeConfigurationFiles>true</GenerateRuntimeConfigurationFiles>
  </PropertyGroup>
<ItemGroup>    
    <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0" />
  </ItemGroup>

Und jetzt der dritte Schritt

Jetzt compilieren wir einmal das komplette Projekt (dafür das entladene Projekt wieder laden und dann neu erstellen).
Wenn das erfolgreich war, können wir zum nächsten Schritt springen. Falls nicht, alle bisherigen MySQL Funktionen ausklammern,
damit wir gleich das Model generieren können, müssen wir einmal compiliert haben.

Jetzt der vierte Schritt, zusammgengefasst

Wir öffnen jetzt Powershell oder CMD (am besten als Administrator).
Jetzt navigieren wir zu unseren Projektfiles (wo die .csproj Datei liegt).

Beispiel: "cd C:\Users\Administrator\ragemp_project\proj"

Dort führen wir schnell noch einen kleinen Befehl aus - "dotnet restore"

Um jetzt die Modelle zu generieren, müssen wir uns einen kleinen Befehl zusammenschreiben.

dotnet ef dbcontext scaffold "Host=localhost;Port=3306;Database=vita;Username=root;Password=xxx" Pomelo.EntityFrameworkCore.MySql -o Model -f

Hier die richtigen MySQL Daten hinterlegen.

Wenn wir das jetzt ausführen, und wir keine Fehler erhalten, müssten im Projekt jetzt die Modelle liegen unter dem Ordner "Model".
Wenn ihr Änderungen an der Datenbank durchführt, dann müsst ihr das nochmal ausführen, am besten schreibt ihr dafür eine .bat Datei!
 

Der fünfte Schritt, ein Beispielcode

Jetzt haben wir EntityFrameworkCore funktionsfähig in das Projekt integriert. Wir können jetzt auf die Datenbank zugreifen, siehe Beispiel!

using System.Linq;

using(var db = new Model.databasenameContext())
{
	var accounts = db.Accounts.FirstOrDefault(x => x.SocialClub == player.SocialClub); // Accounts = Model
	if(accounts == null) return; // Account wurde nicht gefunden

	accounts.Online = 1;
	db.SaveChanges();
}

 

Bei Fragen einfach melden, oder falls ich etwas nicht richtig geschrieben habe einfach bescheid geben!

 

Viel Spaß damit.

 

Mit freundlichen Grüßen,

Max Jackson

 

Zitat

Der Server startet nicht ohne die richtigen "runtimes", ich habe meinen Runtime-Ordner hochgeladen von der aktuellsten Server-Version (0.3.5)

https://mega.nz/#!NJJzmTSa!eINxe4H0fErE6Cod-bt8fazAi4HSXWA4G9APw5d_E6E

 

Bereits existierende Dateien einfach überspringen. :)

 

Edited by m4a_X
  • Like 2

Share this post


Link to post
Share on other sites

Hallo @m4a_X,

ich bin hier so langsam am verzweifeln :/. Ich habe soweit alles am laufen. Wenn ich die Modelle über die Powershell generiere legt er mir die Dateien an, schön und gut. Wenn ich später einen Befehl ausführe um die Datenbank zu aktualisieren funktioniert das ebenfalls (Datenmodelle in C# erstellt und per PowerShell in der Datenbank aktualisieren lassen). Server läuft auch so lange bis ich was in die Datenbank speichern möchte. Hier ein paar Auszüge:

Spawn.cs (wenn Spieler spawnt, soll ein Log in der DB erstellt werden)

using (var context = new DatabaseContext())
{
  var user = new Entities.User { Name = player.Name };
  context.Users.Add(user);
  context.SaveChanges();
}

Mein DbContext (DatabaseContext.cs) sieht wie folgt aus:

public partial class DatabaseContext : DbContext
    {
        public DatabaseContext(DbContextOptions options) : base() { }

        public DatabaseContext()
        {

        }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseMySql("mein Connection String");
        }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {

        }

        public DbSet<Server.Entities.User> Users { get; set; }
        public DbSet<Server.Entities.Character> Characters { get; set; }
    }       

Ich habe bis hier hin alles nach den offiziellen Anleitungen von Microsoft befolgt. Wenn ich aber jetzt spawne kommt folgende Exception und zwar an der Stelle des zweiten Konstruktors in DatabaseContext.cs:

System.IO.FileLoadException: 'Could not load file or assembly 'System.Diagnostics.DiagnosticSource, Version=4.0.3.0, Culture=neutral
Could not find or load a specific file. (Exception from HRESULT: 0x80131621)'

Wenn ich den zweiten Konstruktor lösche, wird mir die Exception beim Using in Spawn.cs angezeigt. Ich weiß echt nich wo ich was machen muss. Kannst du vielleicht mal einen Einblick in einen DbContext von dir geben, oder mir bitte erklären wo man noch was hinzufügen muss, damit es klappt?

Mit freundlichen Grüßen

VegaZ

Share this post


Link to post
Share on other sites

Moin, habe deinen Text nicht ganz gelesen @VegaZ aber dein Problem in der Fehlermeldung ist aufjedenfall das die Datei "System.Diagnostics.DiagnosticSource" nicht in deinem Runtimes Ordner von RageMP (Server) ist.

 

Grüße

Share this post


Link to post
Share on other sites

Hey @m4a_X,

aber sie ist drin, das habe ich schon überprüft. Weiß echt nicht was ich noch machen kann. Ich kopiere einfach noch mal alles aus deiner Zip-Datei rüber. :/

Edit: Hilft leider auch nicht.

Edit2: Es war nicht die aktuellste Version. Jetzt funktioniert es. Danke trotzdem :D

MfG

Edited by VegaZ

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.