繁体   English   中英

ASP MVC实体框架多态抽象类

[英]Asp MVC Entity Framework Polymorphic Abstract Class

我正在尝试在C#中创建类似于laravel提供的多态关系,在其中您可以拥有一个表(如Uploads),并且它具有两个属性,分别称为uploadable_id和uploadable_type

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

如果我们想添加另一个将来上传很多的模型,我们只需要在uploadable_type中添加它,而无需在upload表中添加诸如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表呢?

我总是忘记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");
    }
  }

在这里发现了一个教程

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM