Frage Werden generische Klassen in Entity Framework nicht als Modelle unterstützt?


Ich versuche so etwas zu tun:

public class TrackerContext : DbContext
{
    public bool TrackNewValues { get; set; }

    public TrackerContext(bool trackNewValues = false)
        : base()
    {
        TrackNewValues = trackNewValues;
    }

    public TrackerContext(string connectinString, bool trackNewValues = false)
        : base(connectinString)
    {
        TrackNewValues = trackNewValues;
    }

    public DbSet<AuditLog<string>> AuditLog { get; set; }
    public DbSet<AuditLogChild> LogChildren { get; set; }
}



public class AuditLog<UserIdOrUserNameColumnType>
{
    public AuditLog()
    {
        Children = new List<AuditLogChild>();
    }

    [Key]
    public Guid AuditLogID { get; set; }

    public UserIdOrUserNameColumnType UserId { get; set; }

    [Required]
    public DateTimeOffset EventDateUTC { get; set; }
}

Aber ich denke DbSet<AuditLog<string>> wird nicht unterstützt. Ich bekomme diesen Fehler:

Weitere Informationen: Der Typ 'TrackerEnabledDbContext.AuditLog`1 [System.String]' wurde nicht zugeordnet.       Überprüfen Sie, ob der Typ nicht explizit ausgeschlossen wurde, indem Sie die Ignore-Methode oder NotMappedAttribute-Datenannotation verwenden.       Stellen Sie sicher, dass der Typ als Klasse definiert wurde, nicht primitiv oder generisch ist und nicht von EntityObject erbt.

Gibt es irgendwelche Möglichkeiten, die ich umsetzen kann? public DbSet<AuditLog<string>> AuditLog { get; set; } ?


8
2018-02-02 17:13


Ursprung


Antworten:


Sie können den generischen Typ nicht zuordnen, da Entity Framework keine generischen Entitätstypen unterstützt. Wenn Sie den EF-Code-First-Ansatz verwenden, müssen Sie daran denken, dass Sie Ihr Modell modellieren sollten POCO-Klassen innerhalb der Einschränkungen, die Entity Framework erstellen können POCO Proxies.

Dies bedeutet kurz gesagt, dass eine solche Klasse:

  • Sollte keine Attribute enthalten
  • Sollte nicht generisch sein
  • Sollte öffentlich sein
  • Darf nicht versiegelt werden
  • Muss nicht abstrakt sein
  • Muss einen öffentlichen oder geschützten Konstruktor haben, der keine Parameter hat

9
2018-02-02 17:14



Ich habe generische Klassen mit Erfolg in Entity Framework verwendet. Wenn Sie Ihre Klasse und DbSet wie folgt deklarieren, wird es funktionieren.

public class AuditLogString : AuditLog<String>{}

public DbSet<AuditLogString>  AuditLogStrings { get;set;}

[Aktualisieren] Ich habe diese Methode in letzter Zeit nicht benutzt und angesichts der Kommentare zu dieser Antwort schlage ich stattdessen Pawels Antwort vor. Allerdings habe ich diese Antwort nicht gelöscht, da ich die Methode verwenden konnte.


5
2018-02-16 20:09