6

Entity Framework と Code First に問題があります。Timestamp プロパティを持つエンティティがあり、データベースに新しいレコードを追加し、SaveChanges を呼び出すと、すべて問題ありません。追加したばかりのレコードを削除しようとすると、次のメッセージが表示されます。

Store update、insert、または delete ステートメントが予期しない数の行 (0) に影響を与えました。エンティティが読み込まれた後に、エンティティが変更または削除された可能性があります。ObjectStateManager エントリを更新します。

EF は、この新しいレコードがデータベースに存在するという事実にもかかわらず、データベースに存在することを知らないようです。別のレコードを更新しようとしても同じメッセージが表示されることがありますが、別のレコードを削除しようとすると機能します。

なぜこれが起こっているのか誰にも分かりますか?

前もって感謝します、ディエゴ

編集 問題を理解しやすくするために、いくつかのコードを組み立てました。

2 つの単純なエンティティがあります。

public class Entidade1
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int ID { get; set; }

    public string Descricao { get; set; }

    [Timestamp]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public byte[] RecTS { get; set; }
}

public class Entidade2
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int ID { get; set; }

    public string Descricao { get; set; }

    [Timestamp]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public byte[] RecTS { get; set; }

    public virtual Entidade1 Entidade1 { get; set; }
}

コンテキスト:

public class DB : DbContext
{
    public DB() : base("DB")
    {
        this.Configuration.AutoDetectChangesEnabled = true;
        this.Configuration.LazyLoadingEnabled = true;
        this.Configuration.ProxyCreationEnabled = true;
    }

    public DbSet<Entidade1> Entidade1 { get; set; }
    public DbSet<Entidade2> Entidade2 { get; set; }
}

そしてコード:

var item = new Entidade1();

        item.Descricao = "teste";

        var db = new DB();

        db.Set(typeof(Entidade1)).Add(item);

        db.SaveChanges();

        var item2 = new Entidade2();

        item2.Descricao = "teste 2";
        item2.Entidade1 = item;

        db.Set(typeof (Entidade2)).Add(item2);

        db.SaveChanges();

        var q = (from c in db.Entidade1
                 where c.Descricao == "teste"
                 select c).FirstOrDefault();

        db.Set(typeof(Entidade1)).Remove(q);

        db.SaveChanges();

        var q2 = (from c in db.Entidade2
                  where c.Descricao == "teste 2"
                  select c).FirstOrDefault();

        db.Set(typeof (Entidade2)).Remove(q2);

        db.SaveChanges(); // Here I got the error
4

2 に答える 2

4

この問題は Entity Framework 4.0 の既知のバグであり、2010 年から存在し、次のバージョン (4.5 を希望) で解決されることがわかりました。関連オブジェクトを持つオブジェクトを更新すると、EF はすべてのリレーションを更新しようとしますが、親で何も変更されていないため、「0 行」メッセージが表示されます。

それが誰かを助けることを願っています。

于 2012-06-01T18:06:25.517 に答える
1

Contextにローカルスコープを使用することをお勧めします:

Using(var x = new MyObjectContext){
      //
      //....
      x.SaveChanges(); 
     }
于 2012-08-01T05:45:44.733 に答える