Entity Framework 7 (Beta 7) et suivi des entités

entity-framework-core

Question

J'essaie de séparer mon modèle de domaine (qui est responsable de ma logique métier) de mon modèle de données, utilisé par EF 7 pour créer mon schéma.

Je rencontre un problème en ce qui concerne les modifications persistantes apportées à mon modèle de domaine dans ma base de données

Donc, par exemple, étant donné que j'ai le modèle de données PersonTable et le modèle de domaine 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...
}

Et je veux conserver les modifications de mon domaine dans ma base de données en procédant comme suit:

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

Lorsque j'essaie d'appliquer ces modifications, un message InvalidOperationException s'affiche:

"L'instance du type d'entité 'Tables.PersonTable' ne peut pas être suivie car une autre instance de ce type avec la même clé est déjà suivie. Pour les nouvelles entités, envisagez d'utiliser un IIdentityGenerator pour générer des valeurs de clé uniques."

Je suppose que cela a quelque chose à voir avec le suivi des entités, mais comment cela fonctionne-t-il dans EF 7? Je veux pouvoir appliquer ce modèle afin de pouvoir séparer ces deux modèles.

Réponse populaire

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

et au moment de la sauvegarde, nous devons utiliser le code suivant.

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


Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi