web-dev-qa-db-de.com

Getting "Der Entitätstyp <Modell> ist nicht Teil des Modells für den aktuellen Kontext."

Ich habe dieses Problem, indem ich meine Datenbankspalte zu einer Zeit in asp.net mit web api aktualisiere. Ich versuche, einen PUT abzufragen, um nur einen Wert in der Zeile zu aktualisieren, anstatt diesen zu aktualisieren und den Rest auf Null zu setzen. Ich habe ein separates Modell außerhalb des Controllers angefertigt, um das Update zu übernehmen, damit ich eines nach dem anderen machen konnte. Wenn ich diese Zeile db.Entry(user).State = EntityState.Modified; in der Steuerung drücke, ist dies die Stelle, an der sie fehlerhaft ist. Irgendwelche Ratschläge, wie ich das beheben kann?

Dies ist mein separates ViewModel, das ich in der Put-Methode aufnehme:

namespace WebAPI.Models.ViewModels
{
    public class UserViewModel
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }
}

Dies ist mein Controller, der in der Methode mit dem ViewModel in meinem Parameter aufruft:

public HttpResponseMessage PutUser(int id, UserViewModel user)
        {
            HttpResponseMessage response;

            if (db.User.IsInRole("Admin"))
            {
                try
                {
                        db.Entry(user).State = EntityState.Modified;
                        db.SaveChanges();
                }
                catch (DbUpdateConcurrencyException)
                {
                    if (!UserExists(id))
                    {
                        response = new HttpResponseMessage(HttpStatusCode.NotFound);
                        return response;
                    }
                    else
                    {
                        throw;
                    }
                }

                response = new HttpResponseMessage(HttpStatusCode.NoContent);
                return response;
            }

Dies ist meine DBContext-Datei:

public partial class Entities : DbContext
    {
        public Entities()
            : base("name=Entities")
        {
        }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            throw new UnintentionalCodeFirstException();
        }
        public virtual DbSet<User> Users { get; set; }
    }
}
14
Shawn

Der Fehler rührt von der Initialisierung des Datenkontexts db her. 

Das Benutzerobjekt wurde in einer separaten db erstellt. Wenn Sie versuchen, user zu aktualisieren, weiß die aktuelle Datenbank nicht über dieses user-Objekt. 

Sie könnten es lösen, indem Sie einen Benutzer bekommen 

try
{
    // or check on FirstName and LastName if you don't have a user id
    var updatedUser = db.Users.SingleOrDefault(x => x.id == id);

    updatedUser.FirstName = user.FirstName;
    updatedUser.LastName = user.LastName;

    db.Entry(updatedUser).State = EntityState.Modified;
    db.SaveChanges();
 }

Alternativ können Sie sicherstellen, dass der Datenkontext, den Sie zum Erstellen des user-Objekts verwenden, mit demjenigen identisch ist, der den Benutzer zu aktualisieren versucht. 

Ergibt das Sinn für dich?

13

Dies ist immer dann der Fall, wenn Ihr Repository dynamisch auf verschiedene Entity Framework DbContext zugreifen muss, dh auf verschiedene Datenbanken.

Überprüfen Sie Ihre Datenverbindungszeichenfolge in der Datei web.config für jeden Entity Frmework DbContext.

Zum Beispiel:

 <add name="CRMEntities" connectionString="metadata=res://*/CRMEntities.csdl|res://*/CRMEntities.ssdl|res://*/CRMEntities.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=Your Data Source;initial catalog=CRM;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />

Überprüfen Sie die Metadaten in connectionString, wenn sie auf einen korrekten DbContext zeigen.

In diesem Beispiel verweist es auf eine Demx-Datei mit dem Namen "CRMEntities".

25
ChinaHelloWorld

Stellen Sie sicher, dass der richtige Metadaten-Teil mit dem in edmx übereinstimmt.

connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;"
4
Muhammad Bilal

Aktualisieren Sie das Modell, um die ID-Eigenschaft einzuschließen.

Dann mach

var e = db.Entry(user);

e.Property(p => p.FirstName).Modified = true;

In der Eigenschaftszeile geben Sie einzelne Felder an.

2
jwatts1980

Ihr Viewmodel ist kein vollständig qualifiziertes Benutzerobjekt. Als solches müssen Sie sich eins besorgen.

Dieser Aufruf db.User.IsInRole("Admin") scheint darauf hinzuweisen, dass Sie bereits den aktuellen Benutzer haben. Sie sollten diesen einfach ändern und ihn dann für Änderungen einreichen

try
{
    db.User.FirstName = user.FirstName;
    db.User.LastName = user.LastName;

    db.Entry(db.User).State = EntityState.Modified;
    db.SaveChanges();
}
2
Travis J

Dies ist mir passiert, weil jemand in der app.config eine neue Verbindungszeichenfolge erstellt hat, indem er aus einem vorhandenen Element ausgeschnitten und eingefügt wurde.

Das Ergebnis sah so aus:

<connectionStrings>
    <add
        name="Db1Context"
        connectionString="metadata=res://*/Db1Context.csdl|res://*/Db1Context.ssdl|res://*/Db1Context.msl;..."
        providerName="System.Data.EntityClient"
    />
    <add
        name="Db2Context"
        connectionString="metadata=res://*/Db1Context.csdl|res://*/Db1Context.ssdl|res://*/Db1Context.msl;..."
        providerName="System.Data.EntityClient"
    />
</connectionStrings>

Beachten Sie, wie Db2Context in seinen Metadaten immer noch auf DbContext1 verweist ...

1
Jeff Dege

Ich habe auch diese Ausnahme bekommen. Ich habe es gelöst, indem Sie mit der rechten Maustaste auf das Entity.edmx-Modell im Diagramm klicken und die Verbindung zu meiner Datenbank über "Update Model From Database" aktualisieren.

Ich weiß nicht, warum das funktioniert hat, aber zumindest in meinem Fall.

1
user7183038

Ich hatte das gleiche Problem, als ich die Ausnahme bekam, als ich versuchte, eine Instanz meiner Klasse zum DbSet hinzuzufügen. Mein Problem war, dass die Definition der Tabelle in der Datenbank nicht mit meinem aktuellen Objekt übereinstimmt (in meinem Modell fehlten 2 Nicht-Null-Eigenschaften). Ich habe die beiden Eigenschaften zu meiner Klasse hinzugefügt und der Fehler war verschwunden.

0
HarryK

In meinem Fall war eine Spalte in der entsprechenden Entitätsdatei nicht vorhanden. Eine Spaltenzuordnung befand sich in edmx, war jedoch in der charp-Datei nicht vorhanden

0
Manjay_TBAG

Stellen Sie sicher, dass der Server 64 oder 32 Bit umfasst, und kompilieren Sie die Anwendung erneut.

0
Bruno Gomes

Ich hatte das gleiche Problem. .__ Mein Problem war, dass ich keine Mapping-Entität/Tabelle setze. Nach der Zuordnung meiner Entität wurde das Problem gelöst.

0
Diallo