- Posted by robert on September 21, 2009
Das .NET Framework-Konfigurationstool (Mscorcfg.msc) ist seit .NET 2.0 nicht mehr Teil des .NET "Redistributable", sondern nur noch Teil des .NET SKDs. 354MB SDK für ein kleines Tool dass Sicherheitseinstellungen grafisch bearbeiten lässt scheint ein wenig viel. Hier findet sich eine alternative in Form eines inoffiziellen Installers.
Auf Kommandozeilenebenen hilft caspol.exe (CAS-Policies), das in C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727 zu finden ist.
Links:
- Posted by Anton on September 17, 2009
Ich hatte mir heute die Aufgabe gestellt, folgenden Code zu verbessern:
1: _session.Delete(String.Format("FROM {0}", typeName));
2: _session.Flush();
Dieser Code soll eine gesamte Tabelle leeren. Da diese Operationen auf einer SQLite-DB angewendet werden, kann man “Truncate Table” nicht verwenden (SQLite unterstützt diese Funktion nicht). Der Code arbeitet korrekt, aber extrem langsam. Woran liegt das?
Ein Check mit dem SQLite Administrator ergibt, dass die Delete-Operation sehr schnell funktioniert. Was tut also NHibernate? Also habe ich in der Konfigurationsdatei (lite-nhibernate.cfg.xml) <property name="show_sql">true</property> gesetzt. Die Ausgabe bei 100 Testeinträgen war:
1: NHibernate: select logentry0_.Id as Id22_, logentry0_.Message as Message22_, logentry0_.Type as Type22_, logentry0_.Category as Category22_, logentry0_.DateCreated as DateCrea5_22_, logentry0_.Level as Level22_ from Log logentry0_
2: NHibernate: DELETE FROM Log WHERE Id = @p0;@p0 = 1
3: NHibernate: DELETE FROM Log WHERE Id = @p0;@p0 = 2
4: NHibernate: DELETE FROM Log WHERE Id = @p0;@p0 = 3
5: …
6: NHibernate: DELETE FROM Log WHERE Id = @p0;@p0 = 99
7: NHibernate: DELETE FROM Log WHERE Id = @p0;@p0 = 100
NHibernate nimmt sich also jedes Element einzeln vor, um u.a. mögliche Abhängigkeiten zu aufzulösen. Dadurch gehen die Effekte verloren, die SQLite bei dieser Delete-Operation angewendet hätte (nämlich ein Truncate-ähnliches Delete). Ein Artikel dazu: BulkDataOperations using NHibernate. Der Autor gibt auch eine Lösungsmöglichkeit an, die mir aber zu aufwendig erschien. Ich bin schließlich bei folgendem gelandet:
var tableName = new Configuration().AddAssembly(type.Assembly).GetClassMapping(type).Table.Name;
_session.CreateSQLQuery(string.Format("DELETE FROM {0}", tableName)).ExecuteUpdate();
_session.CreateSQLQuery("VACUUM").ExecuteUpdate();
_session.Flush();
Funktioniert gut und schnell. Aber wie bekommt man den TabellenNamen raus? Z.B. durch var tableName = new Configuration().AddAssembly(type.Assembly).GetClassMapping(type).Table.Name; Jedoch hat dies einen Nachteil: Die Konfiguration ist für den Client unterschiedlich zu dem Test-Projekt. Ich hatte schon (mit Stefans Hilfe) einen NHibernateConfigurationService eingebaut. Ich war gerade damit beschäftigt viel Code zu refaktorisieren und Autofac zu erweitern. Dann habe ich noch mal bei stackoverflow nachgeschaut. Da hat mir jemand geholfen. Ich habe den NHibernateConfigurationService wieder rausgenommen. Nun sieht mein Code so aus:
1: String hqlDelete = string.Format("delete {0} t", typeof(LogEntry));
2: _session.CreateQuery(hqlDelete).ExecuteUpdate();
3: _session.CreateSQLQuery("VACUUM").ExecuteUpdate();
4: _session.Flush();
Der Code funktioniert gut und schnell. Das “delete LogEntry t” verstehe ich noch nicht ganz, nehme aber an, dass die gesamte Tabelle die zum Typ LogEntry gemappt wird, geleert wird. Das “VACUUM” ist im Code, damit die DB-Datei nach dem Löschen wieder geschrumpft wird.
- Posted by Stefan on September 14, 2009
Wir befuellen ja haeufig im Frontend einen Repeater. Das einfaedeln der DataSource und das Erstellen und Verknuepfen des EventHandlers fuer ItemDataBound bekommt man mit IntelliSense innerhalb weniger Sekunden hin. Aber wenn man dann den Befuell-Code schreibt, geht es immer wieder los: Wie waren gleich nochmal die ersten 3 Zeilen? Damit ist jetzt Schluss. Einfach die Datei "repeater.snippet" in "Documents/Visual Studio 2008/Code Snippets/Visual C#/My Code Snippets" des Nutzers mit dem man VS ausfuehrt kopieren. Leider zeigt die ReSharper-IntelliSense den Shortcut nicht an, funktionieren tut es trotzdem. Man tippe: rpt [ESC] [TAB]
Der Rest versteht sich von selbst:
repeater.snippet (1,03 kb)
- Posted by robert on September 9, 2009
Ziel eine Virtual-PC 2007 VM in Hyper-V nutzen.
Das erste Problem: Die VM die zwar auf Windows 7 problemlos läuft, möchte auf dem Windows 2008 Server R2 nicht starten. Das Ziel is eh Hyper-V. Wir ignorieren das alos.
Sehr verheißungsvoll VMC2HV. Führt leider nicht zum gewünschten Erfolg. Der Fehler beim Importieren: “Das System der VHD ist korrupt”.
Konvertieren zu VMware
Nächster Ansatz: Zunächst zu VMware konvertieren. Hierbei hilft der VMWare Konverter, der Anstandsfrei durchläuft …
… und dann aus den VMware-Virtuellen-Platten wieder Hyper-V fähige Virtuelle-Platten (VHDs) machen:
Hierbei hilft: Vmdk2Vhd, welches nach einer Registrierung auf http://vmtoolkit.com/ kostenlos herunterzuladen ist.
Nun müssen beim Erstellen einer neuen Hyper-V VM die Platten beim Einrichten angegeben werden:
Schon kann die “Virtual PC 2007” VM als Hyper-V System genutzt werden :-)
Links:
- VMC2HV (Artikel und Download von Technet: VPC –> HyperV, brachte nicht den gewünschten Erfolg)
- VMWare Konverter (VPC –> VMware)
- Vmdk2Vhd (VMware –> HyperV)
- Posted by Oliver on September 5, 2009
Eine kleine Notiz für die Zukunft:
Wenn man eine Configuration-Section aus einer *.config-Datei in eine eigene Datei auslagert, so wie neulich geschehen für die NHibernate-Konfiguration, dann sollte man die "Copy to Output Directory"-Option auf "Copy Always" setzen:
<!-- Lokal eine passende NH.config anlegen -->
<hibernate-configuration configSource="NH.config" />

Ansonsten bekommt man nämlich eine der folgenden ähnliche Fehlermeldung:
System.Configuration.ConfigurationErrorsException: Die configSource-Datei "NH.config" kann nicht geöffnet werden.
(G:\Projects\Camping.Info\Tests\bin\Debug\Tests.dll.config line 12)
Oliver