Question

Compilé requête:

   public static class Machines
   {
      public static readonly Func<OperationalDataContext, short, Machine>
          QueryMachineById = 
           CompiledQuery.Compile((OperationalDataContext db, short machineID) =>
           db.Machines.Where(m => m.MachineID == machineID).SingleOrDefault()
     );

     public static Machine GetMachineById(IUnitOfWork unitOfWork, short id)
     {
        Machine machine;

        // Old code (working)
        //var machineRepository = unitOfWork.GetRepository<Machine>();
        //machine = machineRepository.Find(m => m.MachineID == id).SingleOrDefault();

        // New code (making problems)
        machine = QueryMachineById(unitOfWork.DataContext, id);

        return machine;
     }

Il ressemble à la requête compilé est le résultat d'un autre retour contexte de données

  [TestMethod]
  public void GetMachinesTest()
  {
     using (var unitOfWork = IoC.Get<IUnitOfWork>())
     {
        // Compile Query
        var machine = Machines.GetMachineById(unitOfWork, 3);
        // In this unit of work everything works… 
        // Machine from repository (table) is equal to Machine from compile query.
     }

     using (var unitOfWork = IoC.Get<IUnitOfWork>())
     {
        var machineRepository = unitOfWork.GetRepository<Machine>();

        // Get From Repository
        var machineFromRepository = machineRepository.Find(m => m.MachineID == 2).SingleOrDefault();
        // Get From COmpiled Query
        var machine = Machines.GetMachineById(unitOfWork, 2);

        VerifyMachine(machineFromRepository, 2, "Machine 2", "222222", ...);
        VerifyMachine(machine, 2, "Machine 2", "222222", ...);

        Assert.AreSame(machineFromRepository, machine);       // FAIL
     }
  }

Si je lance d'autres tests unitaires (complexe) que je reçois comme prévu:   Une tentative a été faite pour attacher ou Ajouter une entité qui n'est pas nouveau, peut-être avoir été chargé d'une autre DataContext.

Une autre information importante est que ce test est en TransactionScope (Mais le problème apparaît même sans transaction autour.)

J'utilise Poços mis en correspondance avec DB en utilisant XML.

Mise à jour: Il ressemble lien suivant est décrit le même problème (est-ce bug a été résolu?): http: // sociale. msdn.microsoft.com/Forums/en-US/linqprojectgeneral/thread/9bcffc2d-794e-4c4a-9e3e-cdc89dad0e38

Était-ce utile?

La solution 2

Il est un bug et il ne sera pas résolu.

problème similaire a été décrit dans le poste de lien ci-dessous. J'ai essayé de ne pas utiliser PK dans la requête compilé comme suggéré, mais eu le même problème. Donc, il y a un problème avec les requêtes compilées sans passer par le cache.

Solution de contournement pour LINQ to SQL entité identité Mise en cache et Compilé Bug de requête

Autres conseils

Vous pouvez essayer de régler la ObjectTrackingEnabled du contexte false. Cela m'a aidé dans cette même situation, mais je me tourne plus tard, pendant que la mise à jour et l'insertion d'enregistrements.

DBDataContext.ObjectTrackingEnabled = false; // Read Only
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top