web-dev-qa-db-fra.com

Comment mettre à jour l'enregistrement à l'aide du noyau de la structure d'entité?

Quelle est la meilleure approche pour mettre à jour les données d'une table de base de données dans le cœur de travail du cadre d'entité?

  1. Retrive la rangée du tableau, apporte les modifications et enregistre
  2. Utiliser un mot clé Mise à jour dans un contexte de base de données et gérer une exception pour un élément inexistant

Quelles sont les fonctionnalités améliorées que nous pouvons utiliser sur EF6?

41
Charith

Pour mettre à jour une entité avec Entity Framework Core, il s’agit du processus logique:

  1. Créer une instance pour la classe DbContext
  2. Récupérer une entité par clé
  3. Apporter des modifications sur les propriétés de l'entité
  4. Sauvegarder les modifications

Update() méthode dans DbContext:

Commence le suivi de l'entité donnée dans l'état Modifié de telle sorte qu'elle sera mise à jour dans la base de données lorsque la fonction SaveChanges() sera appelée.

La méthode de mise à jour n'enregistre pas les modifications dans la base de données; au lieu de cela, il définit des états pour les entrées dans l'instance DbContext.

Nous pouvons donc appeler la méthode Update() avant de sauvegarder les modifications dans la base de données.

Je vais supposer quelques définitions d'objet pour répondre à votre question:

  1. Le nom de la base de données est Store

  2. Le nom de la table est Product

Définition de la classe de produit:

public class Product
{
    public int? ProductID { get; set; }

    public string ProductName { get; set; }

    public string Description { get; set; }

    public decimal? UnitPrice { get; set; }
}

Définition de la classe DbContext:

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 =>
        {
            // Set key for entity
            entity.HasKey(p => p.ProductID);
        });

        base.OnModelCreating(modelBuilder);
    }
}

Logique pour mettre à jour l'entité:

using (var context = new StoreDbContext())
{
        // Retrieve entity by id
        // Answer for question #1
        var entity = context.Products.FirstOrDefault(item => item.ProductID == id);

        // Validate entity is not null
        if (entity != null)
        {
            // Answer for question #2

            // Make changes on entity
            entity.UnitPrice = 49.99m;
            entity.Description = "Collector's edition";

            // Update entity in DbSet
            context.Products.Update(entity);

            // Save changes in database
            context.SaveChanges();
        }
}

S'il vous plaît laissez-moi savoir si cela est utile

48
H. Herzl

Selon documentation Microsoft :

l'approche en lecture-première nécessite une lecture supplémentaire de la base de données et peut entraîner un code plus complexe pour la gestion des conflits de simultanéité

Cependant, vous devez savoir que l'utilisation de la méthode Update sur DbContext marquera tous les champs comme modifiés et les intégrera tous dans la requête. Si vous souhaitez mettre à jour un sous-ensemble de champs, vous devez utiliser la méthode Attach, puis marquer le champ souhaité comme modifié manuellement.

context.Attach(person);
context.Entry(person).Property("Name").IsModified = true;
context.SaveChanges();
28
Ehsan Mirsaeedi

Microsoft Docs nous donne deux approches.

Recommandé HttpPost Modifier le code: Lire et mettre à jour

C’est la même chose que dans les versions précédentes d’Entity Framework. et c’est ce que Microsoft recommande pour nous.

Avantages

  • Empêche overposting
  • Le suivi automatique des modifications des FE active le drapeau Modified sur les champs modifiés lors de la saisie du formulaire.

Alternative HttpPost Modifier le code: créer et joindre

une alternative consiste à attacher une entité créée par le classeur de modèle au contexte EF et à le marquer comme modifié.

Comme mentionné dans l'autre réponse, l'approche lecture-première nécessite une lecture supplémentaire de la base de données et peut entraîner un code plus complexe pour la gestion des conflits de simultanéité.

3
Nipuna