entity framework - Palabra clave “virtual” de la plantilla DbContext T4 de EntityFramework CTP5
entity-framework entity-framework-ctp5 (3)
La plantilla DbContext T4 que viene con CTP5 no tiene corrección de asociación y no todas las propiedades están marcadas como virtuales. ¿Significa que no es compatible con ChangeTracking cuando está desconectado del contexto? En primer lugar, ¿admite el seguimiento de cambios incluso cuando se realiza un seguimiento por contexto (a través de proxies dinámicos)? Veo que el requisito para el seguimiento de cambios es que todas las propiedades deben marcarse como virtuales.
¿Estamos perdiendo alguna funcionalidad con el generador DbContext en comparación con el generador EF4 POCO?
Cualquier respuesta es muy apreciada.
Creo que las clases que se generan usando DbContext Generator solo usarán "proxies de carga perezosa" y no "proxies de seguimiento de cambios" (note que hay dos tipos de proxies) como se describe en http://blogs.msdn.com/b/adonet/archive/2009/12/22/poco-proxies-part-1.aspx . Como señaló, todas las propiedades asignadas deben ser virtuales para que funcionen los proxies de seguimiento de cambios. Esto no es necesario solo para los servidores proxy de carga diferida (donde solo las propiedades de navegación deben ser virtuales).
Creo que Microsoft debería cambiar esto en la plantilla T4 porque sin los proxies de seguimiento de cambios, es mucho más lento. Especialmente si tienes muchas entidades en el contexto del objeto.
Pude confirmar esto. En el libro Programming Entity Framework: DbContext, en la página 66 se habla de esto. Puede usar un código similar al siguiente para verificar que un objeto está usando un proxy de seguimiento de cambios.
Person p = context.People.Find(123);
bool b = p is IEntityWithChangeTracker;
Me sorprende que la plantilla T4 no haga que todas las propiedades sean virtuales de forma predeterminada. Parece un descuido extraño a menos que haya una razón por la que lo hicieron intencionalmente por alguna razón.
Las propiedades marcadas como virtuales son las propiedades de otro tipo de entidad. Las propiedades como string
, int
etc. nunca se marcan como virtuales.
Se trata de cargar con ganas y perezosos. Echa un vistazo a esto
public class Person
{
public int Id { get; set; }
public virtual Address Address { get; set; }
// ...
}
public class Address
{
public int Id { get; set; }
public string AddressLine1 { get; set; }
// ...
}
static void Main(string[] args)
{
MyDatabaseContext db = new MyDatabaseContext();
Person person = db.Persons.Where(x => x.Id == 1).First();
// person.Address is loaded if the propertie Address, class Person
// is marked as virtual. If NOT its null.
}