web-dev-qa-db-de.com

Der Entitätstyp <Typ> ist nicht Teil des Modells für den aktuellen Kontext

Ich komme in das Entity Framework, aber ich bin mir nicht sicher, ob ich einen kritischen Punkt beim Code-First-Ansatz vermisse.

Ich verwende ein generisches Repository-Muster, das auf dem Code von https://genericunitofworkandrepositories.codeplex.com/ basiert, und habe meine Entitäten erstellt.

Wenn ich jedoch auf die Entität zugreifen oder sie ändern möchte, stelle ich Folgendes fest:

System.InvalidOperationException: Der Entitätstyp Estate ist nicht Teil des Modells für den aktuellen Kontext.

Es passiert, wenn ich versuche, aus meinem Repository darauf zuzugreifen:

public virtual void Insert(TEntity entity)
{
    ((IObjectState)entity).ObjectState = ObjectState.Added;
    _dbSet.Attach(entity); // <-- The error occurs here
    _context.SyncObjectState(entity);
}

Die Datenbank (./SQLEXPRESS) wird einfach erstellt, die Entitäten (Tabellen) werden jedoch beim Start nicht erstellt. 

Ich frage mich, ob ich das Mapping der Entitäten explizit setzen muss? Kann EF das nicht alleine? 

Meine Entität ist:

public class Estate : EntityBase
{
    public int EstateId { get; set; }
    public string Name { get; set; }
} 

Mein Kontext ist so:

public partial class DimensionWebDbContext : DbContextBase // DbContextBase inherits DbContext
{
    public DimensionWebDbContext() :
        base("DimensionWebContext")
    {
        Database.SetInitializer<DimensionWebDbContext>(new CreateDatabaseIfNotExists<DimensionWebDbContext>());
        Configuration.ProxyCreationEnabled = false;
    }

    public new IDbSet<T> Set<T>() where T : class
    {
        return base.Set<T>();
    }

}

Gibt es einen bestimmten Grund, warum dieser Fehler auftritt? Ich habe versucht, Migrationen zu aktivieren und automatische Migrationen ohne Hilfe zu aktivieren.

112
janhartmann

Fügen Sie dies in Ihre benutzerdefinierte DbContext-Klasse ein:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Estate>().ToTable("Estate");
}

Wenn Ihre Tabellen nicht beim Start erstellt werden, ist dies der Grund. Sie müssen DbContext in der OnModelCreating-Methodenüberschreibung darüber informieren. 

Sie können hier entweder benutzerdefinierte Zuordnungen pro Entität vornehmen oder sie in separate EntityTypeConfiguration<T>-Klassen aufteilen.

115
danludwig

Anscheinend ist dieser Fehler sehr allgemein, er kann verschiedene Gründe haben. In meinem Fall war dies Folgendes: Die von .edmx generierte Verbindungszeichenfolge (in Web.config) war ungültig. Nach fast einem ganzen Tag habe ich alles ausprobiert und die Verbindungszeichenfolge von der EF-Zeichenfolge in eine ADO.NET-Zeichenfolge geändert. Das hat mein Problem gelöst.

Die EF-Zeichenfolge sieht zum Beispiel so aus:

<connectionStrings> 
  <add name="BlogContext"  
    connectionString="metadata=res://*/BloggingModel.csdl| 
                               res://*/BloggingModel.ssdl| 
                               res://*/BloggingModel.msl; 
                               provider=System.Data.SqlClient 
                               provider connection string= 
                               &quot;data source=(localdb)\v11.0; 
                               initial catalog=Blogging;
                               integrated security=True; 
                               multipleactiveresultsets=True;&quot;" 
     providerName="System.Data.EntityClient" /> 
</connectionStrings>

Und die ADO.NET-Zeichenfolge sieht folgendermaßen aus:

<connectionStrings>
  <add name="BlogContext"  
        providerName="System.Data.SqlClient"  
        connectionString="Server=.\SQLEXPRESS;Database=Blogging;
        Integrated Security=True;"/> 
</connectionStrings>

Quelle: http://msdn.Microsoft.com/nl-nl/data/jj556606.aspx

60
Christiaan Maks

Für mich bestand das Problem darin, dass ich die Entitätsklasse nicht in meinen Datenbanksatz in den Kontext für das Entitätsframework aufgenommen hatte.

public DbSet<ModelName> ModelName { get; set; }
10
Demodave

Das Problem kann in der Verbindungszeichenfolge liegen. Stellen Sie sicher, dass Ihre Verbindungszeichenfolge für den SqlClient-Anbieter gilt und keine Metadaten vorhanden sind, die sich auf EntityFramework beziehen.

7
Shawn de Wet

Sie können versuchen, die Tabelle aus dem Modell zu entfernen und erneut hinzuzufügen. Sie können dies visuell tun, indem Sie die .edmx-Datei im Projektmappen-Explorer öffnen. 

Schritte:

  1. Doppelklicken Sie im Projektmappen-Explorer auf die EDMX-Datei
  2. Klicken Sie mit der rechten Maustaste auf den Tabellenkopf, den Sie entfernen möchten, und wählen Sie "Aus Modell entfernen".
  3. Klicken Sie nun erneut mit der rechten Maustaste auf den Arbeitsbereich und wählen Sie "Modell aus Datenbank aktualisieren ...".
  4. Fügen Sie die Tabelle erneut aus der Tabellenliste hinzu
  5. Reinige und baue die Lösung
5
Arun

Ich habe diesen Fehler festgestellt, wenn eine vorhandene Tabelle in der Datenbank nicht ordnungsgemäß einem ersten Code-Modell zugeordnet wird. Insbesondere hatte ich ein Zeichen (1) in der Datenbanktabelle und ein Zeichen in C #. Durch das Ändern des Modells in eine Zeichenfolge wurde das Problem behoben.

3
Daniel Leach

Mein Problem wurde behoben, indem der Metadatenteil der Verbindungszeichenfolge aktualisiert wurde. Anscheinend zeigte es auf die falsche .csdl/.ssdl/.msl Referenz.

2
ragnarswanson

Eine andere Sache, die Sie mit Ihrer Verbindungszeichenfolge überprüfen können - der Modellname. Ich habe zwei Entity-Modelle verwendet, zuerst die DB. In der Konfiguration habe ich die Entity-Verbindung für eine Person kopiert, umbenannt und den Teil der Verbindungszeichenfolge geändert. Was ich nicht geändert habe, war der Modellname. Während das Entitätsmodell korrekt generiert wurde, suchte EF bei der Einleitung des Kontextes im falschen Modell nach den Entitäten. 

Es scheint offensichtlich, dass es aufgeschrieben ist, aber es gibt vier Stunden, an denen ich nicht zurückkomme. 

1
Eddie

Für mich bestand das Problem darin, dass ich den von connection string Model (.edmx) generierten ADO.Net verwendete. Durch das Ändern der Verbindungszeichenfolge wurde mein Problem behoben.

0
FN90

Visual Studio 2019 scheint dies für mich zu verursachen. Ich habe das Problem behoben, indem ich das edmx-Modell 2017 erneut generiert habe.

0
chinupson

wenn Sie zuerst DB versuchen, stellen Sie sicher, dass Ihre Tabelle Primärschlüssel hat

0
Mahmoud

Klingt offensichtlich, aber stellen Sie sicher, dass Sie den Typ nicht explizit ignorieren:

modelBuilder.Ignore<MyType>();

0
emragins

zu der Konfiguration hinzugefügte Karte der Entität (auch eine leere) führt dazu, dass der Entitätstyp Teil des Kontextes ist. Wir hatten eine Entität ohne Beziehung zu anderen Entitäten, die mit einer leeren Map behoben wurde.

0
mcfea

Dies kann auch auftreten, wenn Sie einen permanenten Modellcache verwenden, der aus irgendeinem Grund nicht mehr aktuell ist. Wenn Ihr Kontext in einer EDMX-Datei in einem Dateisystem (über DbConfiguration.SetModelStore) zwischengespeichert wurde, wird OnModelCreating niemals aufgerufen, da die zwischengespeicherte Version verwendet wird. Wenn eine Entität in Ihrem zwischengespeicherten Speicher fehlt, wird der obige Fehler angezeigt, obwohl die Verbindungszeichenfolge korrekt ist, die Tabelle in der Datenbank vorhanden ist und die Entität in Ihrem DbContext richtig eingerichtet ist.

0
strickt01