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
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.
Aynı anahtara sahip bir nesne zaten Ob...
Aynı anahtara sahip bir nesne zaten Ob...
Aynı anahtara sahip bir öğe zaten ekle...
Php POST ile aynı ada sahip birden çok...
Hazırda Beklet Hata: org.Hazırda Bekle...