EntityFramework – Erreur de proxy d’entité

Je travaille sur un système utilisant Entityframework depuis plus de 12 mois, et le projet a bien fonctionné jusqu’à hier, où j’ai maintenant une erreur étrange dont je ne sais absolument pas la raison. Je ne fais rien de différent de ce que j’ai fait auparavant, mais une fois que je charge l’entité en question et tente d’accéder à toutes les entités enfants, l’erreur suivante apparaît:

The entity wrapper stored in the proxy does not reference the same proxy 

Quelqu’un peut-il nous éclairer sur ce que cela signifie réellement et quelle en serait la cause?

Afficher mon code ne aide pas vraiment.

Voici une version simplifiée du code:

 var quote = new QuoteHelper().GetById(orderId); var updatedQuotes = new Provider().GetExportQuotes(quote.DeparturePoint.Id,quote.DestinationPoint); 

L’erreur se produit lors de l’access à DeparturePoint et à DestinationPoint, mais le devis est chargé correctement et toutes les propriétés sont chargées.

L’entité Quote ressemble un peu à ceci:

 public class Quote : BaseQuote, ICloneable { public Guid DeparturePointId { get; set; } public virtual LocationPoint DeparturePoint{ get; set; } public Guid DestinationPointId { get; set; } public virtual LocationPoint DestinationPoint{ get; set; } } 

Cela m’est également arrivé lorsque j’ai essayé d’implémenter ICloneable sur mon entité et que je l’ai cloné à l’aide de MemberwiseClone. Travaillait très bien quand j’utilisais des entités que je m’instanciais moi-même. Cependant, lorsque j’ai utilisé cela pour cloner une entité chargée avec EF, j’ai eu cette erreur chaque fois que j’ai essayé de l’append à un DbSet (ou dans diverses autres parties).

Après quelques recherches, j’ai constaté que lorsque vous clonez une entité chargée par EF, vous clonez également la classe proxy. L’une des choses que la classe proxy transporte est une référence au wrapper de l’entité donnée. Comme une copie superficielle ne copie que la référence à l’encapsuleur, vous avez soudainement deux entités qui ont la même instance d’encapsuleur.

À ce stade, EF pense que vous avez créé ou emprunté une classe de mandataire différente pour votre entité, ce qui est supposé être à des fins de mal et vous bloque.

modifier

Voici un extrait que j’ai créé pour contourner ce problème. Notez que cela ne fera que copier les propriétés EF, mais ce n’est pas parfait. Notez que vous devrez le modifier si vous avez des champs privés qui doivent également être copiés, mais vous avez l’idée.

  ///  /// Makes a shallow copy of an entity object. This works much like a MemberwiseClone /// but directly instantiates a new object and copies only properties that work with /// EF and don't have the NotMappedAtsortingbute. ///  /// The entity type. /// The source entity. public static TEntity ShallowCopyEntity(TEntity source) where TEntity : class, new() { // Get properties from EF that are read/write and not marked witht he NotMappedAtsortingbute var sourceProperties = typeof(TEntity) .GetProperties() .Where(p => p.CanRead && p.CanWrite && p.GetCustomAtsortingbutes(typeof(System.ComponentModel.DataAnnotations.NotMappedAtsortingbute), true).Length == 0); var newObj = new TEntity(); foreach (var property in sourceProperties) { // Copy value property.SetValue(newObj, property.GetValue(source, null), null); } return newObj; } 

La solution ci-dessus peut se produire, telle que l’erreur ” Des modifications conflictuelles du rôle x de la relation y ont été détectées “. J’obtiens cette erreur en utilisant cette méthode;

  public virtual TEntity DetachEntity(TEntity entityToDetach) { if (entityToDetach != null) context.Entry(entityToDetach).State = EntityState.Detached; context.SaveChanges(); return entityToDetach; } 

J’espère que cela fonctionnera pour vous aussi.