Adding Entity Framework for Blog Posts (Part 1, Setting up the Database)
Encubrir porque esto será un largo!
Se pueden ver las partes 2 y 3 a) Adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre hombres y mujeres en todos los ámbitos de la vida, incluida la educación; El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. a) Adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre hombres y mujeres en todos los ámbitos de la vida, incluida la educación;.
El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer.
Mientras que yo' he estado satisfecho con mi enfoque basado en archivos para blogar , como una excercise he decidido pasar a usar Postgres para almacenar los post y comentarios de blog M SK2 En este post I' mostraré cómo esto MSC4 se ha hecho junto con unos pocos consejos y trucos que he recogido a lo largo del camino .
Se está preparando la base de datos.
Postgres es una base de datos gratuita con algunas características excelentes. I'm un usuario de SQL Server de larga data M SK2I incluso llevó a cabo talleres de rendimiento en Microsoft hace unos años ) pero Postgress es una gran alternativaMST4 EsMSC5es gratisMSP6 código abiertoMSV7 y tiene una gran comunidadMSSK8 y PGAdminMSS9 para herramientas para administrarlo es la cabeza y los ombros superior al Studio de Gestión del servidor SQLMSM10
Para empezar, necesitará instalar Postgres y PGAdmin. Puede configurarlo como servicio de ventanas o utilizando Docker como he presentado en un anterior post sobre El Comité recomienda al Estado Parte que incluya en su próximo informe periódico información detallada sobre la situación de los derechos humanos y las libertades fundamentales en el marco del Pacto..
El Comité recomienda que el Estado Parte adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre hombres y mujeres en materia de empleo, incluida la eliminación del trabajo forzoso.
En este post I' haré uso de código Primero en el núcleo EF, de esta manera usted puede administrar su base de datos completamente a través del código . Puede, por supuesto, configurar la base de données manualmente y usar EF Core para configurar los modelosM SK3 O por supuesto usar Dapper o otro instrumento y escribir su SQL a mano MSC4o con un enfoque MicroORMMスク5
La primera cosa que tendrás que hacer es instalar los paquetes EF Core NuGet. Aquí uso:
- Microsoft.EntityFrameworkCore - El paquete EF de núcleo
- Microsoft.EntityFrameworkCoreM SK1Design - Esto es necesario para que las herramientas EF Core funcionen.
- Npgsql.EntityFrameworkCoreM SK1PostgreSQL - El proveedor de Postgres para EF Core
Puede instalar estos paquetes usando el gestor de paquete NuGet o el dotnet CLI.
A continuación, necesitamos pensar en los modelos para los objetos de la Base de datos; estos son distintos de ViewModels que se utilizan para pasar datos a las vistas. IM SK2 vamos a usar un modelo simple para los post y comentarios del blog .
public class BlogPost
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public string Title { get; set; }
public string Slug { get; set; }
public string HtmlContent { get; set; }
public string PlainTextContent { get; set; }
public string ContentHash { get; set; }
public int WordCount { get; set; }
public int LanguageId { get; set; }
public Language Language { get; set; }
public ICollection<Comments> Comments { get; set; }
public ICollection<Category> Categories { get; set; }
public DateTimeOffset PublishedDate { get; set; }
}
Nota que I'los he decorado con un par de atributos
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
Esto permite a EF Core saber que el campo Id es la clave principal y que debería ser generado por la base de datos.
También tengo categoría
public class Category
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public string Name { get; set; }
public ICollection<BlogPost> BlogPosts { get; set; }
}
El Comité recomienda que el Estado Parte adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre los hombres y las mujeres en materia de empleo, incluida la eliminación del trabajo forzoso.
public class Language
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public string Name { get; set; }
public ICollection<BlogPost> BlogPosts { get; set; }
}
El Comité recomienda al Estado Parte que incluya en su próximo informe periódico datos estadísticos desglosados por sexo, edad y origen étnico.
public class Comments
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public string Comment { get; set; }
public string Slug { get; set; }
public int BlogPostId { get; set; }
public BlogPost BlogPost { get; set; }
}
Usted'verás que me refiero a la BlogPost en comentarios, y ICollections de los comentarios y categorías en BM SK2ogPost . Estas son propiedades de navegación y es como EF Core sabe cómo unir las tablas juntosMSC4
Establecimiento del Contexto de Db
En la clase DbContext usted' necesitará definir las tablas y las relacionesM SK1 Aquí'la minaMSC3
Expand to see the full code
public class MostlylucidDbContext : DbContext
{
public MostlylucidDbContext(DbContextOptions<MostlylucidDbContext> contextOptions) : base(contextOptions)
{
}
public DbSet<Comments> Comments { get; set; }
public DbSet<BlogPost> BlogPosts { get; set; }
public DbSet<Category> Categories { get; set; }
public DbSet<Language> Languages { get; set; }
protected override void ConfigureConventions(ModelConfigurationBuilder configurationBuilder)
{
configurationBuilder
.Properties<DateTimeOffset>()
.HaveConversion<DateTimeOffsetConverter>();
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<BlogPost>(entity =>
{
entity.HasIndex(x => new { x.Slug, x.LanguageId });
entity.HasIndex(x => x.ContentHash).IsUnique();
entity.HasIndex(x => x.PublishedDate);
entity.HasMany(b => b.Comments)
.WithOne(c => c.BlogPost)
.HasForeignKey(c => c.BlogPostId);
entity.HasOne(b => b.Language)
.WithMany(l => l.BlogPosts).HasForeignKey(x => x.LanguageId);
entity.HasMany(b => b.Categories)
.WithMany(c => c.BlogPosts)
.UsingEntity<Dictionary<string, object>>(
"BlogPostCategory",
c => c.HasOne<Category>().WithMany().HasForeignKey("CategoryId"),
b => b.HasOne<BlogPost>().WithMany().HasForeignKey("BlogPostId")
);
});
modelBuilder.Entity<Language>(entity =>
{
entity.HasMany(l => l.BlogPosts)
.WithOne(b => b.Language);
});
modelBuilder.Entity<Category>(entity =>
{
entity.HasKey(c => c.Id); // Assuming Category has a primary key named Id
entity.HasMany(c => c.BlogPosts)
.WithMany(b => b.Categories)
.UsingEntity<Dictionary<string, object>>(
"BlogPostCategory",
b => b.HasOne<BlogPost>().WithMany().HasForeignKey("BlogPostId"),
c => c.HasOne<Category>().WithMany().HasForeignKey("CategoryId")
);
});
}
}
Podrá ver que he establecido un par de índices en la tabla de BlogPost. Esto es para ayudar con el rendimiento cuando consultando la base de datos; deberías seleccionar los índices basándose en cómo ustedM SK2 va a estar consultando los datos . En este caso hashMST4 slugM ST5 fecha de publicación y idioma son todos los campos IMst6va a estar buscando enM st7
El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer.
Ahora tenemos nuestros modelos y DbContext instalados necesitamos conectarlo a la DB. Mi práctica habitual es añadir métodos de extensión, esto ayuda a mantener todo más organizado :
public static class Setup
{
public static void SetupEntityFramework(this IServiceCollection services, string connectionString)
{
services.AddDbContext<MostlylucidDbContext>(options =>
options.UseNpgsql(connectionString));
}
public static async Task InitializeDatabase(this WebApplication app)
{
try
{
await using var scope =
app.Services.CreateAsyncScope();
await using var context = scope.ServiceProvider.GetRequiredService<MostlylucidDbContext>();
await context.Database.MigrateAsync();
var blogService = scope.ServiceProvider.GetRequiredService<IBlogService>();
await blogService.Populate();
}
catch (Exception e)
{
Log.Fatal(e, "Failed to migrate database");
}
}
}
Aquí establezco la conexión de base de datos y luego ejecuto las migraciones. También llamamos una metodología para llenar la base de données (en mi caso IM SK2yo todavía uso el enfoque basado en archivos, por lo que necesito llenar esta base con los puestos existentes ).
Su cadena de conexión se verá algo así:
"ConnectionStrings": {
"DefaultConnection": "Host=localhost;Database=Mostlylucid;port=5432;Username=postgres;Password=<PASSWORD>;"
},
Using the extension approach means that my Program.cs file is nice and clean
services.SetupEntityFramework(config.GetConnectionString("DefaultConnection") ??
throw new Exception("No Connection String"));
//Then later in the app section
await app.InitializeDatabase();
La sección siguiente es responsable de ejecutar la migración y de configurar realmente la base de datos. MigrateAsync method creará la base de datos si no existe' y ejecutará cualquier migración que sea necesaria. Esta es una gran manera de mantener su base de información sincronizada con sus modelosM SK2
await using var scope =
app.Services.CreateAsyncScope();
await using var context = scope.ServiceProvider.GetRequiredService<MostlylucidDbContext>();
await context.Database.MigrateAsync();
El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer.
Once you have all this set up you need to create your initial migration. This is a snapshot of the current state of your models and will be used to create the database. You can do this using the dotnet CLI M SK2see a) Adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre hombres y mujeres en todos los ámbitos de la vida, incluida la educación; para más detalles sobre la instalación de la herramienta dotnet ef si es necesario):
dotnet ef migrations add InitialCreate
Esto creará un directorio en su proyecto con los archivos de migración. Luego puede aplicar la migración a la base de datos usando:
dotnet ef database update
Esto creará la base de datos y las tablas para usted.