5

Im Plural Video von http://www.asp.net/mvc. Das Modellobjektmitglied wurde in der Mitte eines Videos in virtuell geändert. Er gab keine detaillierte Beschreibung der Änderung. Könnte jemand die Notwendigkeit ausarbeiten?Warum sind die Mitglieder des Domain-Objekts (POCO) virtuell definiert?

public class Restaurant 
{ 
    public virtual int ID { get; set; } 
    public virtual string Name { get; set; } 
    public virtual Address Address { get; set; } 
    public virtual ICollection<Review> Reviews { get; set; } 
} 

BTW, ist die IDBContext im Video Repository-Muster folgt? Sollte der Code Repository-Muster für Best Practice verwenden, wenn dies nicht der Fall ist?

public interface IDbContext 
{ 
    IQueryable<Restaurant> Restaurants { get; } 
    IQueryable<Review> Reviews { get; } 
    int SaveChanges(); 
    T Attach<T>(T entity) where T : class; 
    T Add<T>(T entity) where T : class; 
    T Delete<T>(T entity) where T : class; 
} 

Update: Es sollte eine Vielzahl von Repository-Muster sein. Normalerweise erstellt das Repository-Muster eine Klasse für ein Modellobjekt IRepository<T>. Dieser legte das gesamte Modellobjekt in eine Schnittstelle Restaurants, Reviews. Wie sieht es mit dem typischen aus?

+0

Ein POCO sollte niemals ein Domänenobjekt sein. In Ihrem Beispiel ist jede Entität ein PERSISTENCE-Modell, nicht DOMAIN. Und das Repository-Muster erstellt KEINE Klasse für ein Modellobjekt. Es stellt eine Abstraktion dar und fungiert als Fassade für den Persistenzzugriff, in diesem Fall das EF orm. – MikeSW

Antwort

8

Zusammenfassend erstellt POCO, um POPO mit EF zu arbeiten, Proxy-Klassen, die von Ihren ursprünglichen Entitätsklassen (POCOs) erben. Und so müssen die Eigenschaften virtuell sein, um sie zu überschreiben, so dass sie EF-Änderungsverfolgung und Lazy-Loading-Infrastruktur arbeiten können. Andernfalls ist standardmäßig keine Änderungsverfolgung oder Lazy Loading aktiviert.

Für eine vollständige Antwort auf diese Frage könnte man Working with POCO Entities und Requirements for Creating POCO Proxies

2

Bei Verwendung von Entity Framework müssen Eigenschaften virtuell sein, um das verzögerte Laden zu unterstützen.

1

Vom msdn article lesen müssen; "Für Change-Tracking-Proxys:

Jede Eigenschaft, die einer Eigenschaft eines Entitätstyps im Datenmodell zugeordnet ist, muss nicht versiegelt (NotOverridable in Visual Basic), öffentlich und virtuell (in Visual Basic überschreibbar) sein und setze Accessoren. "