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 DbContext
Klasse:
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 .edmx
was 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=
"data source=(localdb)\v11.0;
initial catalog=Blogging;
integrated security=True;
multipleactiveresultsets=True;""
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:
- Dubbelklik op het .edmx-bestand in de Solution Explorer
- Klik met de rechtermuisknop op de tafelkop die u wilt verwijderen en selecteer “Verwijderen uit model”
- Klik nu opnieuw met de rechtermuisknop op het werkgebied en selecteer “Model bijwerken vanuit database..”
- Voeg de tafel opnieuw toe vanuit de tafellijst
- 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 string
gebruikte 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 sysContext
en shardContext
in 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)