Entity Framework 7 (Beta 7) y seguimiento de entidades

entity-framework-core

Pregunta

Estoy tratando de separar mi modelo de dominio (que es responsable de mi lógica de negocios) con mi modelo de datos, que es lo que EF 7 usa para construir mi esquema.

Tengo un problema con la persistencia de los cambios realizados en mi modelo de dominio en mi base de datos

Por ejemplo, dado que tengo el modelo de datos PersonTable y el modelo de dominio Person:

public class PersonTable
{
    public virtual Guid Id { get; set; }
    public virtual String Name { get; set; }
    public virtual String Surname { get; set; }
}

public class Person
{
    public virtual Guid Id { get; set; }
    public virtual String Name { get; set; }
    public virtual String Surname { get; set; }
    //Other Domain Methods and Constructors...
}

Y quiero persistir los cambios de mi dominio en mi base de datos haciendo esto:

public class PersonTable
{
    public virtual Guid Id { get; set; }
    public virtual String Name { get; set; }
    public virtual String Surname { get; set; }
}

public class Person
{
    public virtual Guid Id { get; set; }
    public virtual String Name { get; set; }
    public virtual String Surname { get; set; }
    //Other Domain Methods and Constructors...
}

Cuando trato de aplicar estos cambios, recibo un InvalidOperationException que dice

"La instancia del tipo de entidad 'Tables.PersonTable' no se puede rastrear porque ya se está rastreando otra instancia de este tipo con la misma clave. Para las nuevas entidades, considere usar un IIdentityGenerator para generar valores de clave únicos".

Supongo que esto tiene algo que ver con el seguimiento de entidades, pero ¿cómo funciona esto en EF 7? Quiero poder aplicar este patrón para poder separar estos dos modelos.

Respuesta popular

// Before updating we have fetch original data row from database.
// So we need to use AsNoTracking().

var originalPerson = PersonDbContext.Person.AsNoTracking().FirstOrDefault(p => p.Id == id);

y al momento de guardar necesitamos usar el siguiente código.

// Before updating we have fetch original data row from database.
// So we need to use AsNoTracking().

var originalPerson = PersonDbContext.Person.AsNoTracking().FirstOrDefault(p => p.Id == id);



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué