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?
Lösung:
try {
context.SaveChanges();
} catch (OptimisticConcurrencyException) {
context.Refresh(RefreshMode.ClientWins, db.Articles);
context.SaveChanges();
}
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();
}
}
}
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.
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; }
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.
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;
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. :)
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://docs.Microsoft.com/zh-tw/ef/ef6/modeling/code-first/fluent/types-and-properties