2017-02-08 2 views
0
public class Repository<TEntity> : IRepository<TEntity> where TEntity : Entity 
{ 
    private IDbSet<TEntity> GetSet() 
    { 
     return _unitOfWork.CreateSet<TEntity>(); 
    } 
} 

In dem obigen Code ist immer folgende Fehlermeldung auf GetSet()Fehler - Der Typ 'TEntity' muss ein Referenztyp sein, um es als Parameter zu verwenden

Fehler 1 Der Typ ' TEntity 'muss ein Referenztyp sein, um es als Parameter' TEntity 'im generischen Typ oder in der Methode' System.Data.Entity.IDbSet 'E: \ Pradeep \ Workshop \ WebAPI \ Extras \ DDD \ DDD.WebAPI \ 4 zu verwenden .DDD.Infrastructure \ Repository \ Repository.cs 44 33 4.DDD.Infrastructure

+3

Was ist 'Entity'? Ist es eine "Struktur" oder eine Schnittstelle? – Sefe

Antwort

0

Wenn Sie class zur where-Anweisung hinzufügen, weiß der Compiler, dass es sich nur um einen Referenztyp handeln kann. Wie folgt aus:

public class Repository<TEntity> : IRepository<TEntity> where TEntity : Entity, class 
{ 
    // ... 
} 
+0

Wenn 'Entity' eine' struct' ist, führt dies zu einem Compilerfehler. – Sefe

+1

@Sefe dann wird das OP 10 Schritte näher, um herauszufinden, das Problem :) –

+1

@CallumLinington: Ja, aber wahrscheinlich nicht zu Enlightmentment. Wenn "Entity" eine Struktur ist, macht die generische Klasse null Sinn, weil der einzige gültige Typparameter "Entity" wäre (es gibt keine Vererbung für "structs"). – Sefe

1

Auf Ihrer Repository Klasse haben Sie eine generische Einschränkung für den Typ-Parameter TEntity:

where TEntity : Entity 

In Entity Framework müssen Entitäten Klassen (erzwungen durch eine where T : class Einschränkung). Da Sie den Fehler erhalten, ist Entity keine Klasse. Die einzigen Möglichkeiten sind, dass es sich um eine struct oder eine Schnittstelle handelt. Abhängig davon, sind die Lösungen für Ihr Problem ganz anders:

  1. Wenn Entity ist ein struct, müssen Sie es zu einem class ändern. Mit EF können Sie keine Entitätsgruppe mit Werttypen erstellen.
  2. Wenn Entity eine Schnittstelle ist, müssen Sie die Referenztypbeschränkung an Ihre Repository-Klasse weiterleiten (und vielleicht benennen Sie währenddessen Ihre Schnittstelle zu IEntity, um den .NET-Codierungsrichtlinien zu entsprechen).

Hier ist der Code, wenn Entity eine Schnittstelle:

public class Repository<TEntity> : IRepository<TEntity> where TEntity : class, Entity 
{ 
    //... 
} 
Verwandte Themen