webentwicklung-frage-antwort-db.com.de

Lösung für: Das Speichern von Anweisungen zum Aktualisieren, Einfügen oder Löschen beeinflusste eine unerwartete Anzahl von Zeilen (0).

Ich habe eine Lösung für Leute gefunden, die eine Ausnahme haben:

Die Anweisung zum Aktualisieren, Einfügen oder Löschen von Informationen hat eine unerwartete Anzahl von Zeilen (0) beeinflusst. Entitäten wurden möglicherweise geändert oder gelöscht, seit Entitäten geladen wurden. Aktualisieren von ObjectStateManager-Einträgen.

Aber trotzdem habe ich eine Frage. 

Ich habe das Thema gelesen: Entity Framework: "Die Anweisungen zum Aktualisieren, Einfügen oder Löschen von Anweisungen wirken sich auf eine unerwartete Anzahl von Zeilen (0) aus."An VMAtm, Robert Harvey

In meinem Fall hatte ich zum Beispiel Tabellenartikel:

Articles
------------
article_id
title
date_cr
date_mod
deleted

Und ich hatte Auslöser:

create trigger articles_instead_of_insert 
on articles instead of insert 
as      
    SET NOCOUNT ON;
    insert into articles(
        article_id, 
        title, 
        date_cr,
        date_mod, 
        deleted
    )
    select 
        user_id, 
        title, 
        isnull(date_cr, {fn NOW()}),
        isnull(date_mod, {fn NOW()}),
        isnull(deleted, 0)
    from inserted;
go

Wenn ich diesen Auslöser lösche, erhalte ich diese Ausnahme nicht. Dieser Auslöser ist also ein Problem. Und jetzt habe ich eine Frage - warum? Soll ich etwas tun?

22
nosbor

Lösung:

try {
    context.SaveChanges();
} catch (OptimisticConcurrencyException) {
    context.Refresh(RefreshMode.ClientWins, db.Articles);
    context.SaveChanges();
}
37
nosbor

Es ist besser, wenn Sie Ihre Speichermethode wie folgt aktualisieren ... Wenn Sie nach jedem addobject und deleteobject oder jeder Änderung die savechange()-Methode des Entitätskontexts aufrufen:

public void Save(object entity)
{
    using (var transaction = Connection.BeginTransaction())
    {
        try
        {
            SaveChanges();
            transaction.Commit();
         }
         catch (OptimisticConcurrencyException)
         {
             if (ObjectStateManager.GetObjectStateEntry(entity).State == EntityState.Deleted || ObjectStateManager.GetObjectStateEntry(entity).State == EntityState.Modified)
                    this.Refresh(RefreshMode.StoreWins, entity);
              else if (ObjectStateManager.GetObjectStateEntry(entity).State == EntityState.Added)
                    Detach(entity);
              AcceptAllChanges(); 
              transaction.Commit();
          }

    }
}
5
Prem Prakash

Es liegt daran, dass Sie SET NOCOUNT ON haben.
Die EF SQL-Anweisung, die ALWAYS generiert, fügt (z. B.) eine Klausel von where @@ROWCOUNT > 0 and [ID] = scope_identity() hinzu.
Beachten Sie die where @@ROWCOUNT > 0-Klausel. Nehmen Sie Ihre SET NOCOUNT ON-Anweisung ab und es sollte funktionieren.

3
Tim

Mögliches Problem: Sie haben ein ReadOnlyAttribute in die Metadaten Ihres Entitätsschlüssels eingefügt, wodurch der Wert Null wird

 [DisplayName("Student ID")]
 [ReadOnly(true)]
 public int StudentID { get; set; }

Lösung: Entfernen Sie das ReadOnlyAttribute

 [DisplayName("Student ID")]
 public int StudentID { get; set; }
1
Jboy Flaga

Ich hatte das gleiche Problem, diese Fehlermeldung ist ziemlich rätselhaft. Die Antwort von webtrifusion hat mir geholfen. Siehe Entity Framework: "Die Anweisung zum Aktualisieren, Einfügen oder Löschen von Anweisungen hat eine unerwartete Anzahl von Zeilen (0) beeinflusst."

Es stellte sich heraus, dass ich vergessen hatte, "Id: 0" in der JSON auf der Clientseite hinzuzufügen.

1
binjiezhao

Ich hatte InsertAsync gesetzt, dass EntityState auf Modified gesetzt wurde, um ein Repository-Muster zu implementieren . Beim Debuggen habe ich die Entity-ID entdeckt, die 0 ist 

    public async Task InsertAsync(T entity)
    {

        dbContext.Entry(entity).State = EntityState.Modified;
        await dbContext.SaveChangesAsync();
    }

Ändern des Entitätsstatus in hinzugefügt wurde behoben.

    dbContext.Entry(entity).State = EntityState.Added;
1
lloyd

Ich hatte den gleichen Fehler, dann wurde mir klar, dass ich den eingestellten Primärschlüssel in der Tabelle und die Einstellung der Inkrementwerte vergessen habe ... 

Ich habe diesen Fehler gefunden, als ich die Entität Aktualisiert habe, und habe vergessen, den Primärschlüsselwert zu übergeben.

So kann Entity den Datensatz mit Bezug auf Primärschlüssel aktualisieren

Lösung: Prüfen Sie, ob der Wert des Primärschlüssels bestanden ist oder nicht, um den angegebenen Datensatz zu aktualisieren. :)

0
Prashant J

In meinem Fall muss das DatabaseGenerated-Attribut festgelegt werden, wenn die ersten Konventionen für benutzerdefinierten Code gelten

public class Car
{
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int Id { get; set; }
    public string Model { get; set; }
    public DateTime Registered { get; set; }
}

oder

Deaktivieren der Identität für numerische Primärschlüssel Im folgenden Beispiel wird die DepartmentID-Eigenschaft auf System.ComponentModel.DataAnnotations.DatabaseGeneratedOption.None festgelegt, um anzugeben, dass der Wert nicht von der Datenbank generiert wird.

modelBuilder.Entity<Department>().Property(t => t.DepartmentID)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

siehe https://docs.Microsoft.com/zh-tw/ef/ef6/modeling/code-first/conventions/custom

und https://www.learnentityframeworkcore.com/configuration/data-annotation-attributes/databasegenerated-attribute

und https://docs.Microsoft.com/zh-tw/ef/ef6/modeling/code-first/fluent/types-and-properties

0
MaxJ