2016-07-13 11 views
0

Ich versuche, eine polymorphe Beziehung in C# zu erstellen, ähnlich wie Laravel bietet, wo Sie eine Tabelle wie Uploads haben und es hat zwei Eigenschaften genannt uploadable_id und uploadable_typeAsp MVC Entity Framework Polymorphe Abstrakte Klasse

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

Wenn wir ein weiteres Modell hinzufügen möchten, das viele Uploads in der Zukunft hat, müssen wir das nur in uploadable_type hinzufügen, ohne ein weiteres Feld wie something_id in die Upload-Tabelle einzufügen.

Ich habe etwas ähnliches in C# unter Verwendung einer abstrakten Klasse zu tun versucht, wie folgt:

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; } 
    } 

Aber wenn ich eine Migration hinzufügen und aktualisieren Sie die Datenbank eine Tabelle namens AttachableEntity erzeugen, die Eigenschaften von umfassen alle Modelle, die diese abstrakte Klasse erben?

Wenn AttachableEntity abstrakt ist, warum wird eine Tabelle namens AttachableEntity generiert und keine Post- oder Kommentartabelle generiert?

Antwort

0

Ich vergesse immer, wie die Konventionen in EF funktionieren, aber was Sie sehen, ist eine TPH (Table Per Hierarchy) -Strategie. Sie scheinen TPT (Tabelle pro Typ) zu wollen.

Sie können dies im Modell mit Attributen steuern, aber besser, die fließend API im DbContext zu verwenden:

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

ich ein tutorial here gesichtet.

+0

danke für den Tipp. Eine Frage allerdings, wenn ich zB eine Post-ID habe, kann ich alle zugehörigen Uploads wie folgt abrufen: 'var post = context.Post.Include (x => x.Upload) .Wobei (x => x.Id = id) .ToList(); 'Aber wie identifiziere ich das verwandte Modell aus der Upload-Klasse, dh wenn ich nur die Upload-Datei-ID habe? In der Tabelle AttachableEntity gibt es kein Diskriminatorfeld? – adam78

+0

Sie sollten die ID wahrscheinlich in die Basisklasse verschieben. Und Sie sollten nur ein 'DbSet ' haben und dann können Sie mit 'Attachables.OfType () .Where (...)' nach Typ filtern –