【问题标题】:Asp MVC Entity Framework Polymorphic Abstract ClassAsp MVC 实体框架多态抽象类
【发布时间】:2016-07-13 09:33:42
【问题描述】:

我正在尝试在 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 中添加它 无需在上传表中添加更多像 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 表?

【问题讨论】:

    标签: c# entity-framework oop inheritance polymorphism


    【解决方案1】:

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

    我发现了一个tutorial here

    【讨论】:

    • 感谢您的提示。但是有一个问题,如果我有一个帖子 id,我可以得到所有相关的上传,如下所示:var post = context.Post.Include(x =&gt; x.Upload).Where(x =&gt; x.Id = id).ToList(); 但是我如何从 Upload 类中识别相关模型,即如果我只有上传文件 id? AttachableEntity表中没有discriminator字段?
    • 您可能应该将 Id 移至基类。你应该只有一个DbSet&lt;Attachable&gt;,然后你可以用Attachables.OfType&lt;Post&gt;().Where(...)过滤类型
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-19
    • 1970-01-01
    • 2015-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多