NHibernate und Sql Server Filegroups
Mit NHibernate.Tool.hbm2ddl.SchemaExport kann man ganz komfortabel aus der NHibernate Konfiguration einen DDL Sql Script erzeugen lassen.
Leider stellt zur Zeit NHibernate (v2.1.2) keine Unterstützung in Sachen Sql Server Filegroups zur Verfügung (oder ich habe das noch nicht entdeckt),
es gibt also keine direkte Möglichkeit die Indizes alle in eine eigenen Filegroup zu packen.
Hier ein Workaround zu diesem Thema...
Snippet zum Erzeugen des DDL Scripts:
private static void CreateSqlScripts(string filename, NHibernate.Cfg.Configuration config)
{
if (string.IsNullOrEmpty(filename) || config == null) return;
try
{
var export = new NHibernate.Tool.hbm2ddl.SchemaExport(config);
export.SetDelimiter(";");
export.SetOutputFile(filename);
export.Create(Verbose, false);
}
catch (System.Exception ex)
{
ieg.Log.Log.Info(typeof(NHibernateFactory), "", ex);
throw;
}
}
Nach dem ich zwecks Skalierung meine Indizes alle in eine eigenen Filegroup packen möchte hat sich folgender Workaround bewährt:
Snippet zum Austauchen der Filegroup Informationen im erzeugten DDL Script:
private static string ReplaceIndexFileGroup(string input)
{
const string pattern = @"(?<start>create\s+index\s+\w+\s+on\s+\w+\s+\(\w+(?<field>,\s+\w+)*\))(?<end>;)";
const string replacement = "${start} on Indices;";
var rgx = new Regex(pattern);
var result = rgx.Replace(input, replacement);
return result;
}
Mit Hilfe von regular expressions wird der gesamte Sql Script nach 'Create Index' durchsucht und mit der gewünschten Filegroup ergänzt.
aus:
create index idxName on tEmployee (Lastname, Firstname);
wird:
create index idxName on tEmployee (Lastname, Firstname) on Indices;
Wünschenswert wäre eine Möglichkeit dies gleich in NHibernate umsetzen zu können, gleiches gilt natürlich auch für Tabellen, zum Beispiel so:
Snippet
[NHMA.Property(NotNull = true, Length = 50, Index = "idxName, Indices")]
public virtual string Lastname { get; set; }
[NHMA.Property(NotNull = false, Length = 50, Index = "idxName, Indices")]
public virtual string Firstname { get; set; }
| < Zurück |
|---|


