SORU
25 EYLÜL 2012, Salı


Aynı anahtara sahip bir nesne zaten ObjectStateManager var. ObjectStateManager edemiyor aynı anahtara sahip birden çok nesne takip

Veritabanı benim edmx saklı yordamlara kullanan bir varlık güncelleştirmeye çalışırken, genel Havuz desenli EF5 kullanma ve bağımlılık injenction için ninject ve bir sorunla karşılaşmak.

DbContextRepository benim güncelleştirin.cs:

public override void Update(T entity)
{
    if (entity == null)
        throw new ArgumentException("Cannot add a null entity.");

    var entry = _context.Entry<T>(entity);

    if (entry.State == EntityState.Detached)
    {
        _context.Set<T>().Attach(entity);
        entry.State = EntityState.Modified;
    }
}

Benim AddressService.benim depo var: döner cs

 public int Save(vw_address address)
{
    if (address.address_pk == 0)
    {
        _repo.Insert(address);
    }
    else
    {
        _repo.Update(address);
    }

    _repo.SaveChanges();

    return address.address_pk;
}

Takın ve EntityState, çarptığında.Değiştirilmiş hata ile üzerinize kusar:

Aynı anahtara sahip bir nesne zaten ObjectStateManager var. ObjectStateManager edemiyor aynı anahtara sahip birden çok nesne izleme.

Öneriler birçok yoluyla internette yığını ve onu gideren bir şey ile geliyor değil baktım. Herhangi bir çalışma alternatif yollarını mutluluk duyacağız.

Teşekkürler!

CEVAP
25 EYLÜL 2012, Salı


Edit: Özgün cevap Local.SingleOrDefault yerine Find kullanılır. İşe yaradı kombinasyonu ile @Juan'ın Save yöntem ama olabilir neden gereksiz sorguları için veritabanı ve else parçasıydı muhtemelen asla idam (yürütülen bir başka parçası olmasına neden olacak durum çünkü zaten sorgulanan veritabanı ve yapmamış bulunan Taraf öyle değil, güncelleme). @Sayesinde sorunu bulmak için BenSwayne.

Eğer aynı anahtara sahip bir varlık zaten bağlam tarafından izlenen olup olmadığını kontrol edin ve geçerli takmak yerine bu varlık değiştirmeniz gerekir:

public override void Update(T entity) where T : IEntity {
    if (entity == null) {
        throw new ArgumentException("Cannot add a null entity.");
    }

    var entry = _context.Entry<T>(entity);

    if (entry.State == EntityState.Detached) {
        var set = _context.Set<T>();
        T attachedEntity = set.Local.SingleOrDefault(e => e.Id == entity.Id);  // You need to have access to key

        if (attachedEntity != null) {
            var attachedEntry = _context.Entry(attachedEntity);
            attachedEntry.CurrentValues.SetValues(entity);
        } else {
            entry.State = EntityState.Modified; // This should attach entity
        }
    }
}  

Gördüğünüz gibi ana konu SingleOrDefault yöntem varlık bulmak için anahtar bilmesi gerekiyor. Basit arayüzü anahtarı (benim örnekteIEntity) açığa oluşturmak ve bu şekilde üzerinde işlem yapmak istediğiniz tüm varlıklar içinde uygulayabilirsiniz.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Evan Coury

    Evan Coury

    29 NİSAN 2007
  • jonathepianist

    jonathepiani

    31 Temmuz 2008
  • TimMinchinLive

    TimMinchinLi

    23 ŞUBAT 2009