例外が発生する人向けのソリューションを見つけました。
ストアの更新、挿入、または削除ステートメントは、予期しない行数(0)に影響しました。エンティティが読み込まれた後に、エンティティが変更または削除された可能性があります。 ObjectStateManagerエントリを更新します。
しかし、とにかく質問があります。
トピックを読みました: Entity Framework: "ストアの更新、挿入、または削除ステートメントが予期しない行数(0)に影響しました。"ToVMAtm、Robert Harvey
私の場合、たとえば表の記事がありました。
Articles
------------
article_id
title
date_cr
date_mod
deleted
そして、トリガーがありました:
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
このトリガーを削除すると、この例外は発生しません。したがって、このトリガーは問題です。そして今、私は質問があります-なぜですか?何かすべきですか?
溶液:
try {
context.SaveChanges();
} catch (OptimisticConcurrencyException) {
context.Refresh(RefreshMode.ClientWins, db.Articles);
context.SaveChanges();
}
このようにsaveメソッドを更新する方が良いです..... addobjectとdeleteobjectまたは修正のたびにエンティティコンテキストのsavechange()
メソッドを呼び出す場合:
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();
}
}
}
_SET NOCOUNT ON
_があるためです。
生成するEF SQLステートメントは、常にwhere @@ROWCOUNT > 0 and [ID] = scope_identity()
の句を追加します(たとえば)。
_where @@ROWCOUNT > 0
_句に注意してください。 _SET NOCOUNT ON
_ステートメントを削除すると、動作するはずです。
考えられる問題:エンティティキーのメタデータにReadOnlyAttributeを配置したため、その値がゼロになります
[DisplayName("Student ID")]
[ReadOnly(true)]
public int StudentID { get; set; }
解決策:ReadOnlyAttributeを削除します
[DisplayName("Student ID")]
public int StudentID { get; set; }
私は同じ問題を抱えていた、このエラーメッセージはかなり不可解なものです。 webtrifusionからの答えは私を助けてくれました。 Entity Framework: "ストアの更新、挿入、または削除ステートメントが予期しない行数(0)に影響しました。" を参照してください。
クライアント側のJSONに「Id:0」を追加するのを忘れていました。
InsertAsyncに Repository pattern を実装するEntityStateをModifiedに設定しました。デバッグ時に entity's id が0であることがわかりました
public async Task InsertAsync(T entity)
{
dbContext.Entry(entity).State = EntityState.Modified;
await dbContext.SaveChangesAsync();
}
エンティティの状態を追加に変更すると、修正されました。
dbContext.Entry(entity).State = EntityState.Added;
同じエラーが発生し、テーブルの主キーの設定と増分値の設定を忘れたことがわかりました...
エンティティを更新し、主キー値を渡すのを忘れたときにこのエラーが見つかりました。
そのため、エンティティはプライマリキーを使用してレコードを更新できます
解決策:指定されたレコードを更新するために、主キー値がパスかどうかを確認します。 :)
私の場合、Custom Code First ConventionsのときにDatabaseGenerated属性を設定する必要があります
public class Car
{
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int Id { get; set; }
public string Model { get; set; }
public DateTime Registered { get; set; }
}
または
数値主キーのIDをオフにする次の例では、DepartmentIDプロパティをSystem.ComponentModel.DataAnnotations.DatabaseGeneratedOption.Noneに設定して、データベースによって値が生成されないことを示します。
modelBuilder.Entity<Department>().Property(t => t.DepartmentID)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
https://docs.Microsoft.com/zh-tw/ef/ef6/modeling/code-first/conventions/custom を参照してください
および https://docs.Microsoft.com/zh-tw/ef/ef6/modeling/code-first/fluent/types-and-properties