我正在尝试在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表?
答案 0 :(得分:0)
我总是忘记EF中的约定是如何工作的,但你看到的是TPH(Table Per Hierarchy)策略。你似乎想要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。