Dies ist der logische Prozess, um eine Entität mit Entity Framework Core zu aktualisieren:
- Instanz für
DbContext
Klasse erstellen
- Entität per Schlüssel abrufen
- Nehmen Sie Änderungen an den Eigenschaften der Entität vor
- Änderungen speichern
Update()
Methode in DbContext
:
Beginnt mit der Verfolgung der angegebenen Entität im Status "Geändert", sodass sie beim SaveChanges()
Aufruf in der Datenbank aktualisiert wird.
Die Aktualisierungsmethode speichert keine Änderungen in der Datenbank. Stattdessen werden Zustände für Einträge in der DbContext-Instanz festgelegt.
Daher können wir die Update()
Methode vorher aufrufen , um Änderungen in der Datenbank zu speichern.
Ich gehe von einigen Objektdefinitionen aus, um Ihre Frage zu beantworten:
Der Datenbankname lautet Store
Tabellenname ist Produkt
Produktklassendefinition:
public class Product
{
public int? ProductID { get; set; }
public string ProductName { get; set; }
public string Description { get; set; }
public decimal? UnitPrice { get; set; }
}
DbContext-Klassendefinition:
public class StoreDbContext : DbContext
{
public DbSet<Product> Products { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer("Your Connection String");
base.OnConfiguring(optionsBuilder);
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Order>(entity =>
{
entity.HasKey(p => p.ProductID);
});
base.OnModelCreating(modelBuilder);
}
}
Logik zum Aktualisieren der Entität:
using (var context = new StoreDbContext())
{
var entity = context.Products.FirstOrDefault(item => item.ProductID == id);
if (entity != null)
{
entity.UnitPrice = 49.99m;
entity.Description = "Collector's edition";
context.SaveChanges();
}
}
int?
für verwendetProductID
? Wird es optionaler Primärschlüssel?Laut Microsoft-Dokumenten :
Sie sollten jedoch wissen, dass die Verwendung der Update-Methode in DbContext alle Felder als geändert markiert und alle in die Abfrage einbezieht . Wenn Sie eine Teilmenge von Feldern aktualisieren möchten, sollten Sie die Attach-Methode verwenden und dann das gewünschte Feld als manuell geändert markieren .
context.Attach(person); context.Entry(person).Property(p => p.Name).IsModified = true; context.SaveChanges();
quelle
context.Entry(person).Property(p => p.Name).IsModified = true;
context.Entry(person).State = EntityState.Modified;
_context.Attach(person).State = EntityState.Modified;
angeben, dass diese Entität bei der SaveChanges-Methode aktualisiert werden soll.quelle
Es ist super einfach
quelle
Microsoft Docs bietet zwei Ansätze.
Dies ist die gleiche alte Methode, die wir in früheren Versionen von Entity Framework verwendet haben. und das empfiehlt uns Microsoft.
Vorteile
Modified
Flag für die Felder, die durch Formulareingabe geändert werden.Eine Alternative besteht darin, eine vom Modellordner erstellte Entität an den EF-Kontext anzuhängen und als geändert zu markieren.
Wie in der anderen Antwort erwähnt, erfordert der Read-First-Ansatz ein zusätzliches Lesen der Datenbank und kann zu komplexerem Code für die Behandlung von Parallelitätskonflikten führen.
quelle
Nachdem ich alle Antworten durchgesehen hatte, dachte ich, ich werde zwei einfache Optionen hinzufügen
Wenn Sie bereits mit FirstOrDefault () mit aktivierter Verfolgung auf den Datensatz zugegriffen haben (ohne die Funktion .AsNoTracking () zu verwenden, da dadurch die Verfolgung deaktiviert wird) und einige Felder aktualisiert haben, können Sie einfach context.SaveChanges () aufrufen.
In einem anderen Fall haben Sie entweder eine Entität mit HtppPost auf den Server gebucht oder die Verfolgung aus irgendeinem Grund deaktiviert. Dann sollten Sie context.Update (entityName) vor context.SaveChanges () aufrufen.
Die erste Option aktualisiert nur die von Ihnen geänderten Felder, die zweite Option aktualisiert jedoch alle Felder in der Datenbank, obwohl keiner der Feldwerte tatsächlich aktualisiert wurde :)
quelle
Ein allgemeinerer Ansatz
Um diesen Ansatz zu vereinfachen, wird eine "ID" -Schnittstelle verwendet
Die Hilfsmethode
Verwendung
quelle