Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Entity Framework 4, Log SQL

Îåêßíçóå áðü ôï ìÝëïò pmatsinopoulos. Τελευταία δημοσίευση από το μέλος nikolaosk στις 09-12-2010, 15:15. Υπάρχουν 8 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  06-12-2010, 23:45 61339

    Entity Framework 4, Log SQL

    Καλησπέρα,

    Υπάρχει τρόπος, στο Entity Framework 4, να κάνω log τα SQL statements που στέλνει στη βάση; Εκτός του SQL Profiler.

    Ευχαριστώ πολύ

  •  06-12-2010, 23:59 61340 σε απάντηση της 61339

    Απ: Entity Framework 4, Log SQL

    Δες το άρθρο Profiling Database Activity in the Entity Framework της Julie Lerman στο MSDN Magazine αυτού του μήνα... Δεν έχει ξεχάσει να παραλείψει τίποτα!

     

    George J.


    George J. Capnias: Χειροπρακτικός Υπολογιστών, Ύψιστος Γκουράρχης της Κουμπουτερολογίας
    w: capnias.org, t: @gcapnias, l: gr.linkedin.com/in/gcapnias
    dotNETZone.gr News
  •  07-12-2010, 00:31 61341 σε απάντηση της 61339

    Απ: Entity Framework 4, Log SQL

    Νομίζω έχεις πιάσει ακριβώς το μεγάλο θέμα-ανησυχία που υπάρχει σε όσους συναδέλφους χρησιμοποιούν το EF σαν την data access τεχνολογία τους.

    Αν έχεις budget, σου προτείνω ανεπιφύλακτα (το προτείνει και η Julie Lermann ) το καταπληκτικό αυτό εργαλείο.

    Αλλιώς , δες αυτό εδώ το post . Αν δεις την προηγούμενη δημοσίευση θα καταλάβεις ότι πρόκειται για wrappers που κάνουν extend το EF. Μπορείς να τους κατεβάσεις από εδώ.

    Επίσης ένα καλό εργαλείο είναι το Huagati Query Profiler .

    Νικόλαος Καντζέλης
    BSc, MSc, MCAS, MCPD, MCITP, MCTS,MCP, MCT
    http://www.nksolutions.gr
    http://dotnetstories.wordpress.com
    http://weblogs.asp.net/dotnetstories
    http://forum.dotnetnuke.gr
  •  07-12-2010, 00:33 61342 σε απάντηση της 61341

    Απ: Entity Framework 4, Log SQL

    Γιώργο πρέπει να συγχρονιστούμε....    :)

    Φίλε μου, ο Γιώργος έχει δίκιο, ότι θες είναι στο άρθρο της Julie που ούτε και εγώ το είχα υπόψιν μου.


    Νικόλαος Καντζέλης
    BSc, MSc, MCAS, MCPD, MCITP, MCTS,MCP, MCT
    http://www.nksolutions.gr
    http://dotnetstories.wordpress.com
    http://weblogs.asp.net/dotnetstories
    http://forum.dotnetnuke.gr
  •  07-12-2010, 00:42 61343 σε απάντηση της 61342

    Απ: Entity Framework 4, Log SQL

    Ευχαριστώ πολύ και τους δυό.

    Ήδη δοκίμασα το IntelliTrace. Και τώρα προχωρώ στο EFTracingProvider. Θα κοιτάξω μετά και τα εμπορικά εργαλεία.

    Ευχαριστώ και πάλι.

     

  •  07-12-2010, 01:09 61344 σε απάντηση της 61343

    Απ: Entity Framework 4, Log SQL

    Ωραία άσκηση μου έδωσες Γιώργη ;)

    Για να δούμε τι ψάρια πιάνει το EF θα χρησιμοποιήσω τα εργαλεία αυτά σε συνάρτηση με τον φίλο μου τον SQL Server Profiler


    Antonios Chatzipavlis

  •  07-12-2010, 01:13 61345 σε απάντηση της 61343

    Απ: Entity Framework 4, Log SQL

    Για αυτούς που θέλουν να το δοκιμάσουν:

    1) IntelliTrace. Εντάξει, αυτό είναι απλό και παίζει με το Visual Studio Ultimate. Έχει το πρόβλημα ότι δεν δείχνει τις τιμές των παραμέτρων όπως αναφέρει και η Lerman στο άρθρο της.

    2) EFTracingProvider. Κατέβασα την έκδοση που είναι επικαιροποιημένη για το Entity Framework 4. Από εδώ. Στο παράδειγμα που έκανα χρησιμοποίησα την AdventureWorks2008. Αυτά που χρειάστηκαν να κάνω ήταν τα εξής:

       2.1.) Έκανα extend την AdvenctureWorks2008Entities ως εξής (το σχετικό κώδικα τον βρήκα εδώ (όπως μου υποδείξατε) αλλά έκοψα το caching):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
     
        public partial class ExtendedAdventureWorks2008Entities : AdventureWorks2008Entities
        {
            private TextWriter logOutput;
    
            public ExtendedAdventureWorks2008Entities()
                : this("name=AdventureWorks2008Entities")
            {
            }
    
            public ExtendedAdventureWorks2008Entities(string connectionString)
                : base(EntityConnectionWrapperUtils.CreateEntityConnectionWithWrappers(
                        connectionString,
                        "EFTracingProvider"
                ))
            {
            }
    
            #region Tracing Extensions
    
            private EFTracingConnection TracingConnection
            {
                get { return this.UnwrapConnection<EFTracingConnection>(); }
            }
    
            public event EventHandler<CommandExecutionEventArgs> CommandExecuting
            {
                add { this.TracingConnection.CommandExecuting += value; }
                remove { this.TracingConnection.CommandExecuting -= value; }
            }
    
            public event EventHandler<CommandExecutionEventArgs> CommandFinished
            {
                add { this.TracingConnection.CommandFinished += value; }
                remove { this.TracingConnection.CommandFinished -= value; }
            }
    
            public event EventHandler<CommandExecutionEventArgs> CommandFailed
            {
                add { this.TracingConnection.CommandFailed += value; }
                remove { this.TracingConnection.CommandFailed -= value; }
            }
    
            private void AppendToLog(object sender, CommandExecutionEventArgs e)
            {
                if (this.logOutput != null)
                {
                    this.logOutput.WriteLine(e.ToTraceString().TrimEnd());
                    this.logOutput.WriteLine();
                }
            }
    
            public TextWriter Log
            {
                get { return this.logOutput; }
                set
                {
                    if ((this.logOutput != null) != (value != null))
                    {
                        if (value == null)
                        {
                            CommandExecuting -= AppendToLog;
                        }
                        else
                        {
                            CommandExecuting += AppendToLog;
                        }
                    }
    
                    this.logOutput = value;
                }
            }
    
    
            #endregion
        }

    2.2) Στο app.config file της εφαρμογής πρόσθεσα τα παρακάτω:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    <system.data>
    		<DbProviderFactories>
    			<add name="EF Tracing Data Provider"
    				 invariant="EFTracingProvider"
    				 description="Tracing Provider Wrapper"
    				 type="EFTracingProvider.EFTracingProviderFactory, EFTracingProvider, Version=1.0.0.0, Culture=neutral, PublicKeyToken=def642f226e0e59b" />
    			<add name="EF Generic Provider Wrapper"
    				 invariant="EFProviderWrapper"
    				 description="Generic Provider Wrapper"
    				 type="EFProviderWrapperToolkit.EFProviderWrapperFactory, EFProviderWrapperToolkit, Version=1.0.0.0, Culture=neutral, PublicKeyToken=def642f226e0e59b" />
    		</DbProviderFactories>
    	</system.data>
    	<appSettings>
    		<!-- write log messages to the console. -->
    		<add key="EFTracingProvider.logToConsole" value="false" />
    
    		<!-- append log messages to the specified file -->
    		<add key="EFTracingProvider.logToFile" value="sqllog.txt" />
    	</appSettings>

    Και αυτό ήταν!!!!

    Όλα τα SQL commands μου γράφτηκαν στο sqllog.txt.

    Αρκετά καλά και απλά!

    Και θα πει κάποιος: "Μα καλά, θα πάω τώρα παντού, όπου έχω γράψει 'new AdventureWorks2008Entitie()' και θα το αλλάξω σε 'new ExtendedAdventureWorks2008Entities()'?"

    Την απάντηση μάλλον θα τη δώσει το Factory pattern. Κακώς εξαρχής γράφουμε new ΧΧ(). Γιατί καρφώνουμε τον τρόπο που κάνουμε construct τα αντικείμενά μας. Πρέπει να χρησιμοποιούμε Factory methods. (π.χ. using (var context = ContextFactory.create()) { ... })

    Θα κοιτάξω τώρα και τα εργαλεία που αναφέρατε σχετικά με το logging.

     

  •  07-12-2010, 10:58 61349 σε απάντηση της 61344

    Απ: Entity Framework 4, Log SQL

    Antonios Chatzipavlis:

    Ωραία άσκηση μου έδωσες Γιώργη ;)

    Για να δούμε τι ψάρια πιάνει το EF θα χρησιμοποιήσω τα εργαλεία αυτά σε συνάρτηση με τον φίλο μου τον SQL Server Profiler

    Αν βάλεις το EFProf του Ayende δεν θες κάτι άλλο - πάρε την trial για τις δοκιμές σου.

    Μόνο μια γραμμή κώδικα θα πρέπει να προσθέσεις για να παίξει - καμιά άλλη αλλαγή στον υπάρχοντα κώδικά σου.

     

    George J.


    George J. Capnias: Χειροπρακτικός Υπολογιστών, Ύψιστος Γκουράρχης της Κουμπουτερολογίας
    w: capnias.org, t: @gcapnias, l: gr.linkedin.com/in/gcapnias
    dotNETZone.gr News
  •  09-12-2010, 15:15 61410 σε απάντηση της 61349

    Απ: Entity Framework 4, Log SQL

    και αυτό εδώ το post, συνεισφέρει στην κουβέντα που έχουμε για "logging sql statements produced by EF4"

    Νικόλαος Καντζέλης
    BSc, MSc, MCAS, MCPD, MCITP, MCTS,MCP, MCT
    http://www.nksolutions.gr
    http://dotnetstories.wordpress.com
    http://weblogs.asp.net/dotnetstories
    http://forum.dotnetnuke.gr
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems