het type en lt; type & GT; maakt geen deel uit van het model voor de huidige context

Ik kom in het entiteitsraamwerk, maar ik ben niet zeker of ik een kritiek punt mist in de code-eerste benadering.

Ik gebruik een generieke repository patroon op basis van de code van https://genericunitofworkandrepositories.codeplex.com/en hebben mijn entiteiten gemaakt.

Maar wanneer ik de entiteit probeer te openen of aan te passen, voer ik het volgende aan:

System.invalidOperationException: het Estate Estate Entity is niet onderdeel
van het model voor de huidige context.

Het gebeurt wanneer ik probeer toegang te krijgen tot mijn repository:

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

De database (./SQLEXPRESS) is prima gemaakt, maar de entiteiten (tabellen) worden gewoon niet gemaakt bij het opstarten.

Ik vraag me af of ik expliciet moet stellen het in kaart brengen van de entiteiten? Is het niet in staat om dit niet te gebruiken?

Mijn entiteit is:

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

Mijn context is zo:

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

Is er een specifieke reden waarom deze fout optreedt? Ik heb geprobeerd migraties in te schakelen en automatische migraties mogelijk te maken zonder hulp.


Antwoord 1, Autoriteit 100%

Plaats dit in uw aangepaste DbContextKlasse:

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

Als uw tabellen niet worden aangemaakt bij het opstarten, is dit waarom. U moet de DBCONTEXT over hen vertellen in de onmodelcreatingsmethode.

U kunt hier aangepaste voermappingen uitvoeren, of scheiden ze in afzonderlijke EntityTypeConfiguration<T>CLASSES.


Antwoord 2, Autoriteit 52%

Blijkbaar is deze fout erg generiek, het kan een aantal redenen hebben. In mijn geval was het de volgende: de verbindingsreeks (in Web.config) gegenereerd door de .edmxwas ongeldig. Na bijna een dag van alles proberen, heb ik de verbindingsreeks van de EF-tekenreeks gewijzigd naar een ADO.net-string. Dit heeft mijn probleem opgelost.

Bijvoorbeeld, de EF-tekenreeks ziet er zoiets uit:

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

En de ADO.NET-string ziet er als volgt uit:

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

Bron: http://msdn.microsoft.com/nl-nl/ data/jj556606.aspx


Antwoord 3, autoriteit 12%

Voor mij was het probleem dat ik de Entity Class niet had opgenomen in mijn db-set binnen de context voor het entiteitsraamwerk.

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

Antwoord 4, autoriteit 9%

U kunt proberen de tabel uit het model te verwijderen en opnieuw toe te voegen. U kunt dit visueel doen door het .edmx-bestand te openen vanuit de Solution Explorer.

Stappen:

  1. Dubbelklik op het .edmx-bestand in de Solution Explorer
  2. Klik met de rechtermuisknop op de tafelkop die u wilt verwijderen en selecteer “Verwijderen uit model”
  3. Klik nu opnieuw met de rechtermuisknop op het werkgebied en selecteer “Model bijwerken vanuit database..”
  4. Voeg de tafel opnieuw toe vanuit de tafellijst
  5. Opschonen en de oplossing bouwen

Antwoord 5, autoriteit 6%

Het probleem zit mogelijk in de verbindingsreeks. Zorg ervoor dat uw verbindingsreeks voor SqlClient-provider is, zonder metagegevens gerelateerd aan EntityFramework.


Antwoord 6, autoriteit 3%

Mijn probleem is opgelost door het metadatagedeelte van de verbindingsreeks bij te werken. Blijkbaar wees het naar de verkeerde .csdl / .ssdl / .msl-referentie.


Antwoord 7, autoriteit 2%

Ik heb deze fout gezien wanneer een bestaande tabel in de database niet correct wordt toegewezen aan een code first-model. In het bijzonder had ik een char(1) in de databasetabel en een char in C#. Door het model te wijzigen in een string is het probleem opgelost.


Antwoord 8

Een ander ding om te controleren met uw verbindingsreeks – de modelnaam. Ik gebruikte twee entiteitsmodellen, eerst DB. In de configuratie heb ik de entiteitsverbinding voor één gekopieerd, hernoemd en het gedeelte met de verbindingsreeks gewijzigd. Wat ik niet veranderde, was de modelnaam, dus hoewel het entiteitsmodel correct werd gegenereerd, zocht EF, toen de context werd gestart, in het verkeerde model voor de entiteiten.

Het lijkt duidelijk opgeschreven, maar er zijn vier uur die ik niet terugkrijg.


Antwoord 9

Voor mij was het probleem dat ik de connection stringgebruikte die werd gegenereerd door het ADO.Net-model (.edmx). Het wijzigen van de verbindingsreeks loste mijn probleem op.


Antwoord 10

Dit kan ook gebeuren als u een permanente modelcache gebruikt die om de een of andere reden verouderd is. Als uw context in de cache is opgeslagen in een EDMX-bestand op een bestandssysteem (via DbConfiguration.SetModelStore), zal OnModelCreating nooit worden aangeroepen omdat de in de cache opgeslagen versie zal worden gebruikt. Als gevolg hiervan, als een entiteit ontbreekt in uw gecachte winkel, krijgt u de bovenstaande foutmelding, ook al is de verbindingsreeks correct, bestaat de tabel in de database en is de entiteit correct ingesteld in uw DbContext.


Antwoord 11

De boodschap was vrij duidelijk, maar ik heb het niet op het eerste …

Ik ben bezig met twee Entity Framework DB contexten sysContexten shardContextin dezelfde methode.

De entiteit I had gewijzigd \ update is van de ene context, maar toen ik probeerde om het op te slaan naar de andere context als volgt:

invite.uid = user.uid;
sysContext.Entry(invite).State = EntityState.Modified;
sysContext.SaveChanges(); // Got the exception here

maar de juiste versie moet dit:

invite.uid = user.uid;
shardContext.Entry(invite).State = EntityState.Modified;
shardContext.SaveChanges();

Na het passeren van de entiteit om de juiste context deze fout ging weg.


Antwoord 12

Ik werd geconfronteerd met hetzelfde probleem met EntityFrameworkCore proberen om een ​​reeks waarden te werken.

Deze benadering niet werkte

 _dbSet.AttachRange(entity);
  _context.Entry(entity).State = EntityState.Modified;
   await _context.SaveChangesAsync().ConfigureAwait(false);

Na het toevoegen van UpdateRange methode en verwijderen hechten en de toegang alles werk

 _dbSet.UpdateRange(entity);
  await _context.SaveChangesAsync().ConfigureAwait(false);

Antwoord 13

Het klinkt vanzelfsprekend, maar zorg ervoor dat u niet expliciet het negeren van het type:

modelBuilder.Ignore<MyType>();


Antwoord 14

kaart van de entiteit (zelfs een lege) die aan de configuratie wordt toegevoegd, zal ertoe leiden dat het entiteitstype deel uitmaakt van de context. We hadden een entiteit zonder relatie met andere entiteiten die met een lege kaart was opgelost.


Antwoord 15

als u eerst DB probeert, zorg er dan voor dat uw tabel een primaire sleutel

heeft


Antwoord 16

Visual Studio 2019lijkt dit voor mij te veroorzaken. Ik heb het opgelost door het edmx-model in 2017 opnieuw te genereren.


Antwoord 17

Voor mij werd het veroorzaakt omdat ik de entiteitsklasse hernoemde. Toen ik het terugdraaide, was het OK.


Antwoord 18

Ik had dit

using (var context = new ATImporterContext(DBConnection))
{
    if (GetID(entity).Equals(0))
    {
        context.Set<T>().Add(entity);
    }
    else
    {
        int val = GetID(entity);
        var entry = GetEntryAsync(context, GetID(entity)).ConfigureAwait(false);
        context.Entry(entry).CurrentValues.SetValues(entity);
    }
    await context.SaveChangesAsync().ConfigureAwait(false);
}

Dit was in een asynchrone methode, maar ik ben vergeten wait voor GetEntryAsync te zetten, en dus kreeg ik dezelfde fout…


Antwoord 19

Zorg ervoor dat u uw toewijzingsklassehebt ingesteld om naar uw SQL-tabel te verwijzen


Antwoord 20

Ik heb hetzelfde probleem gehad en in mijn geval kreeg ik deze foutmelding omdat de eigenschap-ID’s in mijn klassenbestand niet overeenkwamen met de ID’s die in de database zijn gedefinieerd, b.v. Ik heb een identificatiecode met een hoofdletter geschreven terwijl het in de database allemaal kleine letters waren.


Antwoord 21

Ik krijg hetzelfde probleem in Entity Framewrok en ik heb het opgelost door onderstaande stappen:

1-Open uw Model.edmx
2-wijzig een tafelplaats (voor wijzigen in cs-bestand)
3-Sla het

Ik hoop u u te helpen


Antwoord 22

Verwijder het .edmx-bestand en voeg het opnieuw toe. Vooral als u het framework van het entiteit hebt geüpgraded.


Antwoord 23

kan dom zijn, maar als je deze fout alleen op een tafel hebt, vergeet dan niet om je project schoon te maken en opnieuw op te bouwen (zou veel tijd kunnen besparen)

Other episodes