0

私が使用するコードとクラスの量を減らすために、私はこのメソッドを与えられました:

public TEntity Save(TEntity entity)
            {
                var validatationErrors = Entities.GetValidationErrors().ToList();
                if (validatationErrors.Count() > 0)
                    throw new ValidateException(validatationErrors);

                if (Entities.Entry(entity).State == EntityState.Added)
                    Entities.Set<TEntity>().Add(entity);
                else
                    Entities.Set<TEntity>().Attach(entity);

                Entities.SaveChanges();
                Entities.Entry(entity).Reload();
                return entity;
            }

ただし、新しい製品を作成すると、データベースに追加する条件がスキップされます。したがって、救われません。何かを変更しようとしても、変更されないのも同じです。

これを修正するには、次のようにエンティティをコントローラーに保存する必要があります。

using (var db = new EntitiesDbContext())
                {
                    db.Products.Attach(product);
                    db.Entry(product).State = EntityState.Modified;
                    db.SaveChanges();
                }

これはかなり非効率的なようです。それで、私はそれが機能しないようにする一般的な保存の何が本当に悪いのか疑問に思いましたか?

4

2 に答える 2

1
  • あなたのコードは間違っています。あなたの場合、あなたはAttachあなたの実体に必要はありません。AddあなたはあなたのエンティティにあなたのDbSet:に必要なだけです

            public TEntity Save(TEntity entity)
            {
                Entities.Set<TEntity>().Add(entity);        
                Entities.SaveChanges();
            }
    

覚えておくべきです:

Entities.Set<TEntity>().Add(entity);

に等しい

db.Entry(entity).State = EntityState.Added;

entity.Property = newProperty;

エンティティの状態をModifieddb.Entry(entity).Stateis EntityState.Modified)に設定します

また、エンティティを検証してリロードする必要はありません。ObjectContext自分のためにやれ。

  • エンティティを条件付けするには、次のことを試してください。

        public TEntity Save(TEntity entity)
        {
    
            var dbEntity = Entities.Set<TEntity>().Find(entity.Id);
    
            if (dbEntity != null)               
                dbEntity = entity;
            else
                Entities.Set<TEntity>().Add(entity);
    
            Entities.SaveChanges();
        }
    
于 2012-04-27T15:13:23.810 に答える
0

新しいエンティティを作成する場合は、.Add メソッドを使用する必要があります。.Attach は、データベースに存在することがわかっているオブジェクトがあり、それを取得するためにデータベースに移動するのを避けたい場合に使用する必要があります。

また、一般的な Save メソッドにはいくつかの問題があるようです。

  • 検証を明示的に無効にしない限り、デフォルトで .SaveChanges() がエンティティを検証するため、エンティティを複数回検証します。
  • エンティティが追加された状態の場合、コンテキストによって既に追跡されているため、再度追加する必要はありません。
  • .SaveChanges() は、変更されていない状態ではない、コンテキストによって追跡されるすべてのエンティティを保存しようとします。このメソッドは、渡されたエンティティのみを保存する印象を与えますが、実際にはそれ以上を保存する場合があります
  • DbEntityEntry.Reload() の呼び出しは、アタッチされたエンティティがデータベースの値でプロパティ値を更新する場合にのみ意味があると思います-これを常に行う場合、エンティティをデータベースから取得するのではなく、アタッチする理由が不思議です。
于 2012-04-27T06:07:04.933 に答える