Base de datos

Intersect tiene dos bases de datos, una que almacena los datos del juego (como objetos, mapas, recursos, eventos) y otra que almacena todos los datos relacionados con las cuentas de usuario.

Las tablas de ambas bases de datos se generan autom谩ticamente en funci贸n de los contextos. El contexto del jugador (PlayerContext) y el contexto del juego (GameContext) se definen en los siguientes archivos de la soluci贸n:

  • Intersect.Server/Database/GameData/GameContext.cs
  • Intersect.Server/Database/PlayerData/PlayerContext.cs

Los contextos consisten en DBSets que acaban siendo tablas. Los DBSets se crean a partir de clases en C#.

Las clases de contexto tambi茅n definen las relaciones entre las tablas. Puedes aprender m谩s sobre esto en la documentaci贸n de Entity Framework Core si est谩s interesado.

Campos en la base de datos

Los campos se crean autom谩ticamente a partir de propiedades p煤blicas en una clase, al igual que las tablas se crean autom谩ticamente a partir de clases dentro de los DBSets en un contexto.

Si observas la clase Users en el proyecto del servidor (Interect.Server/Database/PlayerData/User.cs), encontrar谩s campos para el nombre, la contrase帽a, el correo electr贸nico, y m谩s.

Ten en cuenta que Entity Framework s贸lo puede controlar tipos b谩sicos (enteros, cadenas, blobs y referencias a otras clases que existen como DBSet). Debido a estas limitaciones, hemos marcado algunos campos complejos con la etiqueta [NotMapped] y luego tenemos un campo de cadena secundaria que convierte ese campo complejo en json. Para un ejemplo de esto, revisa User.Power y User.PowerJson. Observa como la propiedad PowerJson tiene una propiedad de nombre de columna de manera que se almacena en la base de datos en el campo Power.

A帽adir campos a la base de datos

Para a帽adir un campo a la base de datos, crea una nueva propiedad p煤blica en una clase que se almacene dentro del Entity Framework. En este ejemplo voy a a帽adir un campo para rastrear la 煤ltima direcci贸n IP utilizada por cada usuario.

He a帽adido la siguiente propiedad a la clase User:

public string LastUsedIp { get; set; }

Crear una migraci贸n

Despu茅s de realizar los cambios en las clases del Entity Framework, tendr谩s que crear una migraci贸n. Para crear la migraci贸n hay varios pasos a seguir:

  1. Establece tu proyecto de inicio como Intersect.Server, y el tipo de compilaci贸n como NoFody.

  2. Ahora, compila tu servidor. La compilaci贸n con la configuraci贸n NoFody generar谩 varios archivos dlls necesarios.

  3. En VS, abre la consola del gestor de paquetes Nuget. (Herramientas -> Gestor de Paquetes Nuget -> Consola del Gestor de Paquetes)

  4. Dentro de la consola del gestor de paquetes, establece Intersect.Server como tu proyecto por defecto.

Ahora est谩s listo para generar los archivos de migraci贸n. Introduce el siguiente comando en la consola del gestor de paquetes:

Add-Migration -Context [ContextHere] [InsertMigrationNameHere]

Reemplaza [ContextHere] por GameContext o PlayerContext (dependiendo de la base de datos que hayas modificado).

Reemplaza [InsertMigrationNameHere] con un nombre corto que identifique para qu茅 es la migraci贸n.

Por ejemplo, he a帽adido una propiedad LastUsedId a la clase Users. En este caso usar铆a el siguiente comando:

Add-Migration -Context PlayerContext AddingLastUsedIpToUsers

Tu migraci贸n deber铆a aparecer como un nuevo archivo de c贸digo fuente. Contin煤a y gu谩rdalo.

Ahora que hemos terminado, reestablece la configuraci贸n de la soluci贸n de NoFody a Debug nuevamente y ejecuta tu servidor.

Al ejecutar el servidor, ser谩s bienvenido con un aviso de migraci贸n.

Limitaciones de migraci贸n

Debido a las limitaciones (actuales) de Sqlite, los campos de las bases de datos no pueden ser renombrados ni eliminados. Tenemos algunos campos que mantenemos por ah铆 que no est谩n actualmente en uso debido a estas limitaciones ya mencionadas. Se espera que esta funcionalidad est茅 disponible alg煤n d铆a.

Las migraciones son 煤nicas

Lamentablemente, las migraciones son 煤nicas debido a las limitaciones mencionadas anteriormente con Sqlite. Si los usuarios quieren desinstalar las modificaciones de origen que alteran la base de datos, tendr谩n que utilizar herramientas externas para eliminar los campos de la base de datos o volver a una copia de seguridad anterior a la instalaci贸n de la modificaci贸n.