web-dev-qa-db-ja.com

解決策:ストアの更新、挿入、または削除ステートメントが予期しない行数に影響しました(0)

例外が発生する人向けのソリューションを見つけました。

ストアの更新、挿入、または削除ステートメントは、予期しない行数(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

このトリガーを削除すると、この例外は発生しません。したがって、このトリガーは問題です。そして今、私は質問があります-なぜですか?何かすべきですか?

24
nosbor

溶液:

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

このように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();
          }

    }
}
6
Prem Prakash

_SET NOCOUNT ON_があるためです。
生成するEF SQLステートメントは、常にwhere @@ROWCOUNT > 0 and [ID] = scope_identity()の句を追加します(たとえば)。
_where @@ROWCOUNT > 0_句に注意してください。 _SET NOCOUNT ON_ステートメントを削除すると、動作するはずです。

3
Tim

考えられる問題:エンティティキーのメタデータにReadOnlyAttributeを配置したため、その値がゼロになります

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

解決策:ReadOnlyAttributeを削除します

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

私は同じ問題を抱えていた、このエラーメッセージはかなり不可解なものです。 webtrifusionからの答えは私を助けてくれました。 Entity Framework: "ストアの更新、挿入、または削除ステートメントが予期しない行数(0)に影響しました。" を参照してください。

クライアント側のJSONに「Id:0」を追加するのを忘れていました。

1
binjiezhao

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;
1
lloyd

同じエラーが発生し、テーブルの主キーの設定と増分値の設定を忘れたことがわかりました...

エンティティを更新し、主キー値を渡すのを忘れたときにこのエラーが見つかりました。

そのため、エンティティはプライマリキーを使用してレコードを更新できます

解決策:指定されたレコードを更新するために、主キー値がパスかどうかを確認します。 :)

0
Prashant J

私の場合、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://www.learnentityframeworkcore.com/configuration/data-annotation-attributes/databasegenerated-attribute

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

0
MaxJ