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?
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
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 –