yo sólo he tenido que hacer exactamente lo mismo.Aquí está mi solución (aunque probablemente no sea el mejor enfoque, pero al menos es bastante elegante):
En primer lugar, cree una interfaz para implementar todas las entidades que hereda de INotifyPropertyChanging. Esto se usa para conectar algunos métodos de extensión y mantener nuestra implementación bien separada. En mi caso, la interfaz se llama ISandboxObject:
public interface ISandboxObject : INotifyPropertyChanging
{
// This is just a marker interface for Extension Methods
}
a continuación, crear una nueva clase estática para contener un método de extensión para obtener el DataContext. Esto se logra al buscar un controlador de eventos en el rastreador de cambios LINQ adjunto al evento INotifyPropertyChanging.PropertyChanging. Una vez que hemos encontrado el cambio de seguimiento, podemos obtener el DataContext de allí:
/// <summary>
/// Obtain the DataContext providing this entity
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public static DataContext GetContext(this ISandboxObject obj)
{
FieldInfo fEvent = obj.GetType().GetField("PropertyChanging", BindingFlags.NonPublic | BindingFlags.Instance);
MulticastDelegate dEvent = (MulticastDelegate)fEvent.GetValue(obj);
Delegate[] onChangingHandlers = dEvent.GetInvocationList();
// Obtain the ChangeTracker
foreach (Delegate handler in onChangingHandlers)
{
if (handler.Target.GetType().Name == "StandardChangeTracker")
{
// Obtain the 'services' private field of the 'tracker'
object tracker = handler.Target;
object services = tracker.GetType().GetField("services", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(tracker);
// Get the Context
DataContext context = services.GetType().GetProperty("Context").GetValue(services, null) as DataContext;
return context;
}
}
// Not found
throw new Exception("Error reflecting object");
}
Ahora usted tienen un método de extensión agradable que le proporcionará un DataContext de cualquier objeto que implementa ISandboxObject. Por favor, ponga un poco más de comprobación de errores en esto antes de usarlo con ira.
tengo el mismo problema y aunque entiendo su argumento para esto (créame, estoy a favor de ello), tengo una necesidad en el mundo real para esto. En algunas de nuestras clases parciales de entidad, agregamos algunas propiedades que deben consultar la base de datos en función de una propiedad de su entidad, para obtener una colección de otras entidades, que no están asociadas directamente en el servidor SQL. Esto es realmente feo porque estamos creando un nuevo contexto de datos al llamar estas propiedades (algunas de ellas en un bucle). –