📜  创建发布实体并与用户实体建立多对一关系(1)

📅  最后修改于: 2023-12-03 14:50:15.319000             🧑  作者: Mango

创建发布实体并与用户实体建立多对一关系

在一个应用程序中,通常需要对实体进行持久化操作,同时还需要对不同实体之间建立关联。本文将介绍如何创建发布实体,并与用户实体建立多对一关系。

创建发布实体

在这个例子中,我们将创建一个Post实体,包含标题、内容和发表时间等属性。首先,我们需要定义Post实体类:

public class Post
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }
    public DateTime PublishTime { get; set; }

    public int UserId { get; set; }
    public User User { get; set; }
}

在这个实体类中,我们定义了IdTitleContentPublishTime属性,分别对应了发布实体的唯一标识、标题、内容和发表时间。同时,我们还定义了一个UserId属性,用于关联发布实体与用户实体。

接下来,我们需要在数据库中创建表格用于存储Post实体。假设我们使用Entity Framework Core进行数据库操作,我们可以创建一个dbContext类,以及对应的数据库表格:

public class BlogDbContext : DbContext
{
    public DbSet<Post> Posts { get; set; }
    public DbSet<User> Users { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer("Data Source=(localdb)\\MSSQLLocalDB;Initial Catalog=Blog;");
    }
}

public class CreatePostTable : Migration
{
    protected override void Up(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.CreateTable(
            name: "Posts",
            columns: table => new
            {
                Id = table.Column<int>(type: "int", nullable: false),
                Title = table.Column<string>(type: "nvarchar(max)", nullable: true),
                Content = table.Column<string>(type: "nvarchar(max)", nullable: true),
                PublishTime = table.Column<DateTime>(type: "datetime2", nullable: false),
                UserId = table.Column<int>(type: "int", nullable: false)
            },
            constraints: table =>
            {
                table.PrimaryKey("PK_Posts", x => x.Id);
                table.ForeignKey(
                    name: "FK_Posts_Users_UserId",
                    column: x => x.UserId,
                    principalTable: "Users",
                    principalColumn: "Id",
                    onDelete: ReferentialAction.Cascade);
            });

        migrationBuilder.CreateIndex(
            name: "IX_Posts_UserId",
            table: "Posts",
            column: "UserId");
    }

    protected override void Down(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.DropTable(
            name: "Posts");
    }
}

在上述代码中,我们定义了一个BlogDbContext类,并在其中定义PostsUsers两个DbSet属性,用于操作对应的数据库表格。同时,我们还编写了一个CreatePostTable类,用于数据迁移时自动生成和部署相应的数据库表格。

至此,我们成功创建了发布实体类对应的数据表格,并为实体类添加了关联用户实体的属性。

与用户实体建立关系

我们已经定义了发布实体类,并在其中添加了一个UserId属性,用于表示发表该文章的用户ID。因此,我们需要与用户实体建立多对一的关系。为此,我们需要修改Post实体类中的UserId属性:

public int UserId { get; set; }
public User User { get; set; }

同时,我们还需要在BlogDbContext类中添加User属性:

public DbSet<User> Users { get; set; }

接着,我们只需要重新运行数据迁移命令,以便更新数据库表格:

dotnet ef migrations add AddUserToPost
dotnet ef database update

上述命令将为Post表格新增一个UserId外键,并在需要时为我们自动创建和更新表格结构。

现在,我们已经成功地将发布实体与用户实体建立了多对一的关系。当我们查询一篇文章时,可以通过访问User属性获取该文章对应的作者信息。

using (var db = new BlogDbContext()) {
    var post = db.Posts
        .Include(p => p.User)
        .Where(p => p.Id == 1)
        .FirstOrDefault();

    Console.WriteLine($"Post Title: {post.Title}");
    Console.WriteLine($"Author: {post.User.Name}");
}

以上代码中,我们使用Include方法将User实体根据UserId属性一同载入Post实体,并通过访问User属性获取作者信息。