Pregunta

Auto seguimiento de entidades. Impresionante.

excepto cuando haces algo como

return Db.Users;

ninguna de las Entidades de seguimiento están haciendo un seguimiento (hasta que, posiblemente, se deserializan).

Bella. Así que tenemos que reconocer que hay una posibilidad de que una entidad de regresar a los Estados Unidos no han habilitado el seguimiento.

Ahora qué ???

Cosas que he intentado

En el cuerpo del método dado:

using (var db = new Database())
{
    if (update.ChangeTracker.ChangeTrackingEnabled)
        db.Configurations.ApplyChanges(update);
    else
        FigureItOut(update, db);

    db.SaveChanges();
    update.AcceptChanges();
}

Los siguientes implementaciones de FigureItOut todos fallan:

db.Configurations.Attach(update);
db.DetectChanges();

Ni

db.Configurations.Attach(update);
db.Configurations.ApplyCurrentValues(update);

Ni

db.Configurations.Attach(update);
db.Configurations.ApplyOriginalValues(update);

Ni

db.Configurations.Attach(update);
db.Configurations.ApplyChanges(update

Ni cualquier otra cosa que se me ocurre a lanzar en él, que no sea

  1. Obtener la entidad original a partir de la base de datos
  2. La comparación de cada propiedad con la mano
  3. Actualización de propiedades, según sea necesario

¿Qué, exactamente, se supone que tengo que ver con Entidades de seguimiento que no realizan un seguimiento de ellos ??


actualización Pequeño:

A ciegas marcando la entidad como trabajos modificados, sin embargo, esto parece un poco mal olor. Es lo mejor que podemos hacer en este caso?

¿Fue útil?

Solución

escenario 1

Estas son algunas de las prácticas recomendadas a seguir. Cuando se está utilizando en el escenario STE WCF, se debe confiar en el cambio de seguimiento que implementa STE así en el lado del servidor de hacer lo siguiente.

db.Users.ApplyChanges(user);
db.SaveChanges();

escenario 2 Sin embargo, si usted está en el servidor, la práctica recomendada es crear un método en la clase parcial para ObjectContext llamada EnableChangeTracking. El método sería consultar a las entidades que se encuentran en estado inalterado que implementa IObjectWithChangeTracker y vueltas sobre el cambio de seguimiento para que algo como esto

user = db.users.first(u => u.userid == 1);
db.EnableChangeTracking();

Ahora trata de salvar a la entidad de usuario desde un contexto diferente de la que se recuperó originalmente de

db2.users.ApplyChanges(user);
db2.SaveChanges();

escenario 3 Si en el lado servidor que está conectado con el mismo contexto objeto del que ha recuperado la entidad de usuario de, a continuación, utiliza STE tan simple objeto poco, como a continuación

user = db.users.first(u => u.userid == 1);
user.LastName = "XYZ";
db.DetectChanges(); //no need for it cuz Savechanges implicitly calls this.
db.SaveChanges();

escenario 4 si la entidad de usuario se obtiene a partir de un contexto diferente, entonces el contexto u lo usará para guardar entonces aquí es otra opción donde u marcan la entidad que fue modificada y no importa lo consiguió modificado.

user = db.users.first(u => u.userid == 1);
var db2 = new ObjectContext();
user.LastName = "XYZ";
db2.Users.Attach(user);
// i prefer this option..
db2.ObjectStateManager.ChangeObjectState(user,EntityState.Modified); 
db2.SaveChanges(); // updates all columns

escenario 5 si la entidad de usuario se obtiene a partir de un contexto diferente, entonces el contexto u lo usará para guardar entonces aquí es otra opción donde u recuperar la entidad original.

user = db.users.first(u => u.userid == 1);
user.lastName ="XYZ";
var db2 = new ObjectContext();
db2.Users.First(u => u.userid == user.userid);
db2.users.ApplyCurrentValues(user);
db2.SaveChanges();

Aquí es un blog que describe algunos escenarios. http: / /weblogs.asp.net/zeeshanhirani/archive/2010/03/30/modifying-self-tracking-entity-on-the-server.aspx

I incluye una descripción detallada de estos conceptos en mis Entity Framework 4.0 recetas reservar con una gran cantidad de escenarios ..

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top