2010-01-06 5 views
4

Longue histoire courte: J'utilise LINQ to SQL, mais ai des problèmes avec sa mise en cacheLINQ to cache SQL émet

Mon application métadonnées conduit, donc je ne veux pas la mise en cache sur (changements dans la db devrait être reflété dans le site Web sur une actualisation de page). Y a-t-il un moyen de désactiver la mise en cache? ou un moyen de réinitialiser le cache (par exemple actuellement lorsque je change des données dans la base de données, je dois physiquement changer le code et recompiler avant de voir les résultats).

Et enfin une question C# (j'espère que c'est une erreur de base de ma part). Dans le code ci-dessous si je cours method1 puis method2 puis doc2 == doc1 (et je veux obtenir la valeur d'origine de la db)

Cela me semble très étrange que la classe RecordDictionary est données pivotée (donc ne se rapportent pas directement au modèle), et dans mon code les affectations sont dans des contrôleurs différents; mais en quelque sorte LINQ to SQL est des changements de mise en cache appliqués à doc1 et de les appliquer à doc2 (si je sors de mon application, et recompiler alors doc2 égal ce que je pense que ce soit (jusqu'à ce que je change doc1)

exemple Contrived

public RecordDictionary method1() 
{ 
    RecordDictionary doc1 = genericRepository.GetRecordById(
     action.AppliesToModelEntityId, 27); 

    //do some stuff to doc1 here 
    return doc1; 
} 

public RecordDictionary method2() 
{  
    RecordDictionary doc2 = genericRepository.GetRecordById(
     action.AppliesToModelEntityId, 27); 
    return doc2; 
} 

public RecordDictionary GetRecordById(int ContainerModelId, int id) 
{ 
    var query = (from dv in _db.DataValues 
       where dv.DataInstance.IsCurrent == true && 
        dv.DataInstance.DataContainer.DataContainerId == id 
       select new { 
        dv.DataInstance.DataContainer.ParentDataContainerId, 
        dv }); 

    RecordDictionary result = CreateRecordColumns(
     ContainerModelId, query.FirstOrDefault().ParentDataContainerId); 
    result.Id = id; 

    foreach (var item in query) 
    { 
     if (result.ContainsKey(item.dv.ModelEntity.ModelEntityId)) 
      result[item.dv.ModelEntity.ModelEntityId] = item.dv;        
    } 

    return result; 
} 
+1

Cache cache homie. – jason

+0

Comment savez-vous que LINQ to SQL est en cache? – Jacob

+1

Parce que si j'apporte des modifications directement dans la base de données, ces modifications ne sont pas répercutées dans l'application. –

Répondre

6

C reate un nouveau DataContext par "unité de travail": c'est-à-dire une requête HTTP, ou même une méthode [1] - l'intention est que SubmitChanges soit appelé une fois à la fin de la méthode (ou dans le cadre de l'implémentation).

// Where this is all one (financial) transaction. 
void Transfer(int fromAccountId, int toAccountId, decimal amount) { 
    var db = new Customers(); 
    var fromAccount = db.Accounts.Single(row => row.Id == fromAccountId); 
    var toAccount = db.Accounts.Single(row => row.Id == toAccountId); 
    fromAccount.Balance -= amount; 
    toAccount.Balance += amount; 
    db.SubmitChanges(); 
} 

Vous pouvez aussi appeler DataContext.Refresh() sur les lignes que vous attendez d'avoir changé derrière les DataContexts arrière, mais il est difficile d'utiliser efficacement. Il est destiné à des choses comme des procédures stockées:

var client = db.Clients.Single(row => row.Id == clientId); 
if (!client.CheckingAccount) { 
    db.CreateCheckingAccount(client.Id); // Stored procedure. 
    db.Refresh(RefreshMode.OverwriteCurrentValues, client); 
} 
+1

Merci pour cela, en parlant à mon ami architecte de données, il a dit que les ORM supposent que toutes les modifications de données se produisent via l'ORM, sur la base de données, ou dans la demande, alors vous ne devriez pas utiliser un ORM ... ma réponse était que je n'utiliserais pas un ORM de manière défiante dans ce projet si je partais de zéro, mais comme je suis à une semaine de Test bêta, je n'ai pas vraiment le temps de le refaire;) –

+0

Ahh! Ma déclaration du datacontext était statique, c'est ce qui a causé mon problème principal (j'ai copié du code que j'ai trouvé quelque part) –

1

est-ObjectTrackingEnabled à true sur votre classe de contexte de données? Si vous pouvez donc essayer la mise à false. en outre, vous trouverez peut-être lire this blog entry utile.

+7

Attention: 'ObjectTrackingEnabled = false' désactive' SubmitChanges() '. –

+0

Bonne entrée de blog. Fait intéressant, j'utilise les procédures stockées pour mettre à jour ma base de données, mais je n'ai pas le problème mentionné dans le blog parce que je suis d'abord mettre à jour le datacontext (et donc le cashe), puis appeler le sp. Quand je transforme ObjectTrackingEnabled en false, tout se casse (les assosiations ne semblent plus fonctionner) –