Για αυτούς που θέλουν να το δοκιμάσουν:
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.