Günlerdir bununla başımı çarptım ve hala doğru yaklaşımın hangisi olduğuna karar veremiyorum.
Bu soru, özellikle bir web uygulamasının aksine WPF
'u hedeflemektedir, birçok yayın ve makale çevrimiçi olarak numaralı (context
) yaklaşımı için geçerlidir ve için context
değil.
Entity-Framework DB first
modelini kullanan bir WPF MVVM
uygulamasına sahibim.WPF MVVM uygulamasında DbContext'i yönetme
public partial class User
{
public User()
{
this.Role = new HashSet<Role>();
}
public string ID { get; set; }
public string Name { get; set; }
public virtual ICollection<Role> Role { get; set; }
}
public class Role
{
public Role()
{
this.User = new HashSet<User>();
}
public int ID { get; set; }
public string Name { get; set; }
public virtual ICollection<User> User { get; set; }
}
aşağıdaki bu nasıl ele alınacağı üzerinde seçeneklerimi daralmış ettik:
1)
burada (EF
Designer tarafından oluşturulan) Uygulamamda kullanılan iki modelin bir örnektir
public class Dal
{
public User GetUserById(object userId)
{
using (var db = new DbEntities())
{
return db.User.Find(userId);
db.SaveChanges();
}
}
public void RemoveUser(User userToRemove)
{
using (var db = new DbEntities())
{
db.User.Remove(userToRemove);
db.SaveChanges();
}
}
}
benim 01 kullanabilirsiniz: oluşturur ve her yöntem çağrısı DbContext
uzaklaştıran DataAccess
sınıf oluşturuluyorşöyle:
public class UserManagerViewModel : ObservableObject
{
private readonly Dal dal = new Dal();
// models...
//commands...
}
2) 1 yaklaşır, ancak Using
ifadeleri olmadan:
public class Dal : IDisposable
{
private readonly DbEntities db = new DbEntities();
public User GetUserById(object userId)
{
return db.User.Find(userId);
db.SaveChanges();
}
public void RemoveUser(User userToRemove)
{
db.User.Remove(userToRemove);
db.SaveChanges();
}
public void Dispose()
{
db.SaveChanges();
}
}
kullanım ViewModel
3) içindeki aynıdır Oluştur Her entity
için repository
. Yukarıdaki seçeneklerle aynı şekilde gözükür (ayrıca using
ikilemiyle birlikte veya yok), ancak her depo yalnızca entity
ile ilgili yöntemleri içerir.
Afaik kullanımı, yukarıdaki ViewModel
benimki ile aynıdır. aşağıdaki gibi
public class UnitOfWork : IDisposable
{
private DbEntities db = new DbEntities();
private IUserRepository userRepository;
public IUserRepository UserRepository
{
get
{
return userRepository ?? new UsersRepository(db);
}
}
public void Save()
{
db.SaveChanges();
}
public void Dispose()
{
db.Dispose();
}
}
ve benim ViewModel
içinde kullanmak:
4) talep üzerine uygun Repository
geçecek bir Unit-Of-Work
sınıf oluşturun
public class UserManagerViewModel : ObservableObject
{
private readonly UnitOfWork unit = new UnitOfWork();
// models...
//commands...
}
yukarıdaki yaklaşımın hangisi (eğer varsa) eşzamanlılık, daha iyi soyutlama ve katmanlama ve genel performans açısından tercih edilir mi?
DÜZENLEME -this article. aşağıdaki paragraf Bulunan:
Windows Presentation Foundation (WPF) veya Windows Forms ile çalışan, form başına bir bağlam örneğini kullanın. Bu, içeriğin sağladığı değişiklik izleme işlevini kullanmanıza olanak tanır.
Ancak, benim view-model
bir DbContext
nesne oluşturmak gerekip gerekmediği sorusunu gündeme getiriyor ya da daha iyisini benim DAL
sınıf olarak böyle bir yardımcı sınıf var ve onu referans etmektir.
EF, mükemmel bir UoW (içerik) + deposuna (DbSet) sahiptir. Neden kendiniz yaratıyorsunuz? Bu ekstra katmanlar neredeyse hiç işe yaramıyor. EF modeline yakın servislerde kullanım durumlarını kapsayan iş merkezli uygulamaların aksine iş mantığını müşteriye çeken veri merkezli uygulamalara yönelme eğilimindedirler. Veriyi soyutlama ve soyutlama görevleri (soyutlamanın kalıcılığın uygulanmasını gizlediği anlamına gelir). –
Cevabınız için bu http://mehdi.me/ambient-dbcontext-in-ef6/ – ErikEJ
@GertArnold'a bakın. Özellikle 'WPF MVVM' hakkında soru sorduğumdan beri, uzun ömürlü bir 'DbContext' kullanılmalı mıyım (' görünüm 'modeli başına bir' içerik ') veya' bağlamımın ömrünü sınırlandırmalı mıyım? ' seçenek 1 ('kullanarak' kullanarak) :) – Yoav