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; }
}
}
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?
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="data source=Your Data Source;initial catalog=CRM;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"" 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".
Stellen Sie sicher, dass der richtige Metadaten-Teil mit dem in edmx übereinstimmt.
connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;"
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.
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();
}
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 ...
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.
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.
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
Stellen Sie sicher, dass der Server 64 oder 32 Bit umfasst, und kompilieren Sie die Anwendung erneut.
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.