Marcin K.

Marcin K. Opisuję
rzeczywistość zerami
i jedynkami

Temat: Jak dodać komentarz do kolumny w Nhibernate?

Cześć.

Mam projekt oparty o Nhibernate który tworzy całą bazę przy pierwszym uruchomieniu. Niestety, nie mogę znaleźć jak dodać komentarze do kolumn i tabel. Mam mapowanie we fluencie i interesuje mnie tylko takie rozwiązanie, które nie wymaga xmli. Dobrze żeby to działało przynajmniej na oracle i sqlu. Jak to można zrobić? Szukałem po sieci ale piszą, że we fluencie tego się nie da zrobić, ale może macie jakiś patent?

Dzięki z góry. Pozdrawiam
MK

Temat: Jak dodać komentarz do kolumny w Nhibernate?

Ale wiesz, że FluentNH to tylko "nakładka" i tworzy "pod spodem" właśnie XMLa (HBMa) ? ;)

A poważnie - da się to zrobić tylko w HBMie. Masz jednak coś takiego, jak SimpleAuxiliaryDatabaseObject, za pomocą którego możesz dodać własne polecenia SQL.

Utwórz atrybut komentarza, udekoruj nim klasy modelu i te ich właściwości (property), które chcesz
mapować. Utwórz jakąś klasę narzędziową, w niej statyczną metodę w rodzaju CreateCommentForOracle(NHibernate.Cfg.Configuration config). W tej metodzie przeiteruj po config.ClassMappings (tabele) a następnie po GetProperties opatrzonych Twoim atrybutem, tworząc odpowiedni skrypt. Utwórz SimpleAuxiliaryDatabaseObject, podaj w konstruktorze Twój skrypt i dodaj go metodą config.AddAuxiliaryDatabaseObject. Na koniec zdefiniuj, dla jakiego silnika i dialektu skrypt zostanie wykonany. I tak dla wszystkich silników, jakie zamierzasz wspierać.

Tu masz krótki, ale działąjący przykład:
Zdefiniuj atrybut
 public class DatabaseCommentAttribute : Attribute
{
public string Text { get; set; }
}


Udekoruj klasę i pola
    [DatabaseComment(Text="Tabela ABC")]
public class TabelaABC
{
[DatabaseComment(Text = "Klucz główny")]
public virtual int Id { get; set; }


I wreszcie komentarze:
    public class SupportForComments
{
public static void CreateCommentsSQLServer(NHibernate.Cfg.Configuration config)
{
StringBuilder script = new StringBuilder();
foreach (var mapping in config.ClassMappings)
{
var entityAttributes = (DatabaseCommentAttribute[])(Type.GetType(mapping.ClassName)).GetCustomAttributes(typeof(DatabaseCommentAttribute), true);

if (entityAttributes.Length > 0)
{
script.AppendFormat("EXEC sp_addextendedproperty @name = N'MS_Description', @value = '{0}',@level0type = N'Schema', @level0name = 'dbo',@level1type = N'Table', @level1name = '{1}';", entityAttributes[0].Text, mapping.Table.Name);
script.AppendLine();

foreach (PropertyInfo property in Type.GetType(mapping.ClassName).GetProperties().Where(prop => Attribute.IsDefined(prop, typeof(DatabaseCommentAttribute))))
{
var fieldAttributes = (DatabaseCommentAttribute[])property.GetCustomAttributes(typeof(DatabaseCommentAttribute), true);
if (fieldAttributes.Length > 0)
{
script.AppendFormat("EXEC sp_addextendedproperty @name = N'MS_Description', @value = '{0}',@level0type = N'Schema', @level0name = 'dbo',@level1type = N'Table', @level1name = '{1}', @level2type = N'Column', @level2name = '{2}';", fieldAttributes[0].Text, mapping.Table.Name, property.Name);
script.AppendLine();
}
}
}
script.AppendLine();
}
config.AddAuxiliaryDatabaseObject(new SimpleAuxiliaryDatabaseObject(script.ToString(), null, new HashedSet<string> {typeof(MsSql2005Dialect).FullName, typeof(MsSql2008Dialect).FullName }));
}

public static void CreateCommentsOracle(NHibernate.Cfg.Configuration config)
{
StringBuilder script = new StringBuilder();
foreach (var mapping in config.ClassMappings)
{
var entityAttributes = (DatabaseCommentAttribute[])(Type.GetType(mapping.ClassName)).GetCustomAttributes(typeof(DatabaseCommentAttribute), true);

if (entityAttributes.Length > 0)
{
script.AppendFormat("COMMENT ON TABLE {0} IS '{1}';", mapping.Table.Name, entityAttributes[0].Text);
script.AppendLine();

foreach (PropertyInfo property in Type.GetType(mapping.ClassName).GetProperties().Where(prop => Attribute.IsDefined(prop, typeof(DatabaseCommentAttribute))))
{
var fieldAttributes = (DatabaseCommentAttribute[])property.GetCustomAttributes(typeof(DatabaseCommentAttribute), true);
if (fieldAttributes.Length > 0)
{
script.AppendFormat("COMMENT ON COLUMN {0}.{1} IS '{2}';", mapping.Table.Name, property.Name, fieldAttributes[0].Text);
script.AppendLine();
}
}
}
script.AppendLine();
}
config.AddAuxiliaryDatabaseObject(new SimpleAuxiliaryDatabaseObject(script.ToString(), null, new HashedSet<string> { typeof(Oracle10gDialect).FullName }));
}
}


A następnie:
            return Fluently.Configure(cfg).Mappings(m => m.FluentMappings.AddFromAssemblyOf<..........>()
.ExposeConfiguration(.....)
.ExposeConfiguration(SupportForComments.CreateCommentsForOracle) // jedna z nich się wykona
.ExposeConfiguration(SupportForComments.CreateCommentsForSQLServer) // zależnie od silnika
.BuildConfiguration();
Ten post został edytowany przez Autora dnia 19.07.13 o godzinie 08:24



Wyślij zaproszenie do