ASP MVC 实体框架多态抽象类

本文关键字:多态 抽象类 框架 实体 MVC ASP | 更新日期: 2023-09-27 17:56:40

>我正在尝试在 C# 中创建类似于 laravel 提供的多态关系,您可以在其中拥有一个表,例如上传和它有两个属性,称为uploadable_id和uploadable_type

+----+---------------+-------------------+------------------------------------+
| id | uploadable_id |   uploadable_type |            file_path               |
+----+---------------+-------------------+------------------------------------+
|  1 |    2          |      Post         |        uploads/xyz                 |
|  2 |    6          |    comment        |        uploads/abc                 |
+--------------------+-------------------+------------------------------------+ 

如果我们想添加另一个将来有很多上传的模型,我们只需要在uploadable_type中添加它无需将更多字段(如something_id)添加到上传表中。

我尝试通过使用抽象类在 C# 中执行类似操作,如下所示:

public abstract class AttachableEntity 
{
    public int Id { get; set; }
    public ICollection<Upload> Files { get; set; }
}

public class Post :  AttachableEntity
{
   // other properties
}
public class Comment :  AttachableEntity
{
   public int PostId { get; set; }
   public virtual Post Post { get; set; }
   // other properties
}
 public class Upload 
 {
        public int Id { get; set; }
        public string Filename { get; set; }
        public int AttachableEntityId { get; set; }
        public AttachableEntity AttachableEntity { get; set; }
 }

  public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
  {
    public DbSet<Post> Post { get; set; }
    public DbSet<Comment> Comment { get; set; }
    public DbSet<Upload> Upload { get; set; }
  }

但是当我添加迁移并更新数据库时,它会生成一个名为 AttachableEntity 的表,其中包含来自所有继承此抽象类的模型?

如果 AttachableEntity

是抽象的,为什么会生成一个名为 AttachableEntity 的表,而不会生成 Post 或 Comment 表?

ASP MVC 实体框架多态抽象类

我总是忘记 EF 中的约定是如何工作的,但您看到的是 TPH(每个层次结构的表)策略。您似乎想要 TPT(每种类型的表)。

您可以使用模型中的属性来控制这一点,但最好在 DbContext 中使用流畅的 API:

  public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
  {
    ...
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Post>().ToTable("Posts");
        modelBuilder.Entity<Comment>().ToTable("Comments");
    }
  }

我在这里发现了一个教程。