2011-08-09 28 views
23

Bir varlık almayı ve sonra güncelleştirmeyi deniyorum, ancak izleme olmadan almak istiyorum, bu yüzden yeniden içeriğe ekleyebilirim.İlk önce varlık çerçeve modelindeki izlemeyi kapatın

EntityFramework.dll başvuru numarasına sahibim (4.1). Veritabanını modelden oluşturdum. (ilk kod değil).

alın kullanıcı:

db.Users.MergeOption = MergeOption.NoTracking; 
IQueryable<User> query = db.Users;//.AsNoTracking(); //<-- apparently, this is code-first only. 

return query; 

Güncelleme kullanıcı:

db.Users.Attach(user); //error here. 
ObjectStateEntry entry = db.ObjectStateManager.GetObjectStateEntry(user); 
entry.SetModifiedProperty(propertyName); 
db.SaveChanges(); 
return user; 

Hata: Ben buna

An object with the same key already exists in the ObjectStateManager. The ObjectStateManager cannot track multiple objects with the same key.

böyle yöntemi:

var user = userRepository.GetUsers().FirstOrDefault(u => u.UserId == userId); 
user.Identifiers.Add(someIdent); 
userRepository.UpdateUser(user); 
+0

Çalışması gerekir. Başka bir sorguyla kullanıcı almadığınızdan emin misiniz? –

+0

@Ladislav aynı sorgu. Ben sadece bu kod kullanır –

+0

kodunu kullanarak 1 read/get yöntemi var, tüm kod deposu olmadan benzer kod test ettim ve benim için çalışır. –

cevap

7

Ayrılmak ve takmak yerine. Özgün bağlamdan olabilecek veya olmayabilecek bir öğeyi güncelleme işlemek istiyorsanız, aşağıdakileri yapabilirsiniz.

var originalItem = db.Users.Find(user.UserId); 
db.Entry(originalItem).CurrentValues.SetValues(user); 
db.SaveChanges(); 
+3

Nesnem (originalItem) bir alt öğe topluluğu olan bir özelliğe sahip olduğunda bu benim için işe yaramaz gibi görünmüyor. Bu dava için yapmam gereken özel bir şey var mı? –

17

No izleme Sorgular Bazen varlıklar için sorgulamak ama kişiler bağlamında tarafından izlenecek yok isteyebilirsiniz. Bu, salt okunur senaryolarda çok sayıda varlığın sorgulanması sırasında daha iyi performansla sonuçlanabilir. AsNoTracking uzantısı yöntemi bir sorguyu yürütür ve sonuçları bağlamda izlemeden döndürür. Aşağıdaki örnekte, sorgular nesneleri döndürecek ancak içerik tarafından izlenmeyecektir. diğer

 // Query for all departments without tracking them 
     var departments1 = context.Departments.AsNoTracking().ToList(); 

     // Query for some departments without tracking them 
     var departments2 = context.Departments 
       .Where(d => d.Name.StartsWith("math")) 
       .AsNoTracking() 
       .ToList(); 
+0

Fiyat kaynağı: https://msdn.microsoft.com/en-us/data/jj556203.aspx –

İlgili konular