SORU
17 Aralık 2011, CUMARTESİ


Neden 'sanal' özellikler için sınıfları kullanmak?

Aşağıdaki blog: http://weblogs.asp.net/scottgu/archive/2010/07/16/code-first-development-with-entity-framework-4.aspx

Blog aşağıdaki kod örneği içerir:

public class Dinner
{
   public int DinnerID { get; set; }
   public string Title { get; set; }
   public DateTime EventDate { get; set; }
   public string Address { get; set; }
   public string HostedBy { get; set; }
   public virtual ICollection<RSVP> RSVPs { get; set; }
}

public class RSVP
{
   public int RsvpID { get; set; }
   public int DinnerID { get; set; }
   public string AttendeeEmail { get; set; }
   public virtual Dinner Dinner { get; set; }
}

Bir sınıf içinde bir özellik tanımlarken virtual kullanma amacı nedir? Ne gibi bir etkisi var mı?

CEVAP
17 Aralık 2011, CUMARTESİ


Varlık Çerçevesi özelliği tembel yükleme desteği ve daha etkili izleme değiştirebilir, böylece sanal mülkiyet etrafında bir proxy oluşturmak için olanak sağlar. Daha kapsamlı bir tartışma için What effect(s) can the virtual keyword have in Entity Framework 4.1 POCO Code First? bkz.

Açıklığa kavuşturmak için düzenleme "proxy" etrafında: . oluşturun "" Özellikle Varlık Çerçevesinde yaptığı bahsediyorum. etrafında bir proxy oluşturma Varlık Çerçevesi yükleme ve verimli değişiklik izleme tembel desteklenen navigasyon özellikleri sanal olarak işaretlenmiş olması gerekir. Bakınhttp://msdn.microsoft.com/en-us/library/gg715126(v=VS.103).aspx. Varlık Çerçevesinde devralma belirli özelliklerini temel sınıf pocos ' sanal işaretlenmiş olması gerekir bu yüzden bu işlevleri desteklemek için kullanır. Bu anlamıyla POCO türleri türetilen yeni bir tür oluşturur. Eğer POCO Varlık yapısının dinamik olarak oluşturulan alt sınıflar için temel bir tür olarak hareket. Ne demek istediğimi "proxy" etrafında oluşturun.

Dinamik olarak oluşturulan Varlık Çerçeve statik derleme zamanında çalışma zamanında, Varlık Çerçeve kullanarak belirgin hale oluşturan alt sınıflar. Ve Varlık yapısının tembel yükleme etkinleştirin veya izleme özelliklerini değiştirin. Asla tembel yükleme kullanın veya Varlık Çerçeve değil (varsayılan ayar) izleme özellikleri değiştirmek için seçerseniz o zaman sanal olarak gezinme özelliklerini bildirmeniz gerekmez. Daha sonra Varlık Çerçeve olarak ne ifade eder ya da bu navigasyon özellikleri kendini, yükleme sorumlusunuz "istekli yükleme", ya da el ile birden çok veritabanı sorguları ile ilgili tip alınıyor. Ve tembel yükleme kullanır ve birçok senaryo navigasyon özellikleri için izleme özellikleri değişiklik olsa da olabilir.

Eğer oluşturmak için tek başına bir sınıf ve mark özellik olarak sanal ve sadece inşa ve kullanım örnekleri bu sınıflarda kendi uygulama, tamamen dış kapsamı Varlık Çerçeve, sonra sanal özelliklerini olmaz elde olan bir şeyi kendi.

Sanal olarak işaretlenmiş neden açıklamak için düzenleyin

Özellikler gibi:

 public ICollection<RSVP> RSVPs { get; set; }

Alanlar değildir ve böyle bir düşünce olmamalı. Bu alıcıları ve ayarlayıcıları denir ve derleme sırasında, yöntemleri dönüştürülür.

//Internally the code looks more like this:
public ICollection<RSVP> get_RSVPs()
{
    return _RSVPs;
}

public void set_RSVPs(RSVP value)
{
    _RSVPs = value;
}

private RSVP _RSVPs;

Bu Varlık Çerçevesinde kullanmak için sanal olarak hepsi işaretli, dinamik olarak oluşturulan sınıflar 8 ** DAHİLİ olarak oluşturulan ve set işlevlerini geçersiz kılmak için izin verir. Eğer navigasyon özelliği sizin alıcı/ayarlayıcı Varlık Çerçevesi kullanımı sizin için çalışıyorsa, sadece özellikleri, yeniden gözden geçirilmesi için bunları deneyin, ve eğer Varlık Çerçeve hala düzgün çalışması için mümkün olup olmadığını görmek:

 public virtual ICollection<RSVP> RSVPs;

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • glowpinkstah

    glowpinkstah

    16 Mayıs 2006
  • NextKsa

    NextKsa

    7 EKİM 2009
  • TheJoeycool2010

    TheJoeycool2

    12 Temmuz 2010