2016-07-13 12 views
0

私はあなたがそのようなアップロードなどのテーブルを持つことができ、 それがuploadable_idと呼ばれる2つの特性を有し、のAsp MVC Entity Frameworkのポリモーフィック抽象クラス

​​ をuploadable_typeどこ提供するものlaravelに類似したC#での多型の関係を作成しようとしています

今後アップロードが多い別のモデルを追加したい場合は、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というテーブルが生成され、ポストまたはコメントテーブルが生成されないのですか?

答えて

0

EFの表記規則がどのように機能しているのか、あなたが見ているのはTPH(Table Per Hierarchy)戦略です。 TPT(Table Per Type)が必要なようです。

あなたは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を見つけました。

+0

チップのおかげで。しかし、もし私が例えば投稿IDを持っていれば、関連するすべてのアップロードを以下のように得ることができます:var post = context.Post.Include(x => x.Upload).Where(x => x.Id = id) .ToList(); 'しかし、アップロードクラスから関連モデルを特定するにはどうすればいいですか? AttachableEntityテーブルには、識別子フィールドはありませんか? – adam78

+0

おそらく、Idを基本クラスに移動する必要があります。そして、 'DbSet 'しか持っていないので、 'Attachables.OfType ().Where(...)'でフィルタリングすることができます。 –

関連する問題