Entity Framework 7 (Beta 7) ed Entity Tracking

entity-framework-core

Domanda

Sto cercando di separare il mio modello di dominio (che è responsabile della mia logica aziendale) con il mio modello di dati, che è quello che EF 7 usa per costruire il mio schema.

Ho riscontrato un problema relativo alle modifiche persistenti apportate al mio modello di dominio al mio database

Quindi, ad esempio, dato che ho il modello di dati PersonTable e il modello di 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...
}

E voglio persistere le modifiche al mio dominio nel mio database facendo questo:

public void Update(Person p)
{
    var person = new PersonTable
    {
        Id = p.Id,
        Name = p.Name,
        Surname = p.Surname
    }
    PersonDbContext.Update(person);
    PersonDbContext.SaveChanges();
}

Quando provo ad applicare queste modifiche, viene visualizzato un messaggio InvalidOperationException

"L'istanza del tipo di entità 'Tables.PersonTable' non può essere rintracciata perché un'altra traccia di questo tipo con la stessa chiave è già stata tracciata. Per le nuove entità considerare l'utilizzo di un IIdentityGenerator per generare valori di chiavi univoci."

Presumo che questo abbia qualcosa a che fare con il tracciamento delle entità, ma come funziona in EF 7? Voglio essere in grado di applicare questo modello in modo da poter separare questi due modelli.

Risposta popolare

// 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);

e al momento del salvataggio dobbiamo usare il seguente codice.

PersonDbContext.Entry(originalPerson).Context.Update(newPersonDetail);


Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché