2010-06-04 3 views
2

poco가 정의 된 어셈블리를 기반으로 테이블 이름 앞에 접두사를 붙일 NHibernate의 명명 전략을 작성하려고합니다. 지금 당장의 전략은 테이블에 모든 접두어를 추가하여 유선을 증명하는 것입니다 오른쪽.INaming (Fluent) NHibernate에서 전략을 무시하고 있습니까?

내가 겪고있는 문제는 내 INamingStrategy를 만들고 NHibernate 구성 객체에 연결할 수 있지만 결코 사용되지 않는 것입니다. 여기에 코드 몇 가지 예입니다

private MsSqlConfiguration GetDatabaseConfiguration() 
{ 
var configuration = MsSqlConfiguration.MsSql2008 
    .ConnectionString(ConfigFileReader.GetConnectionString(ConnectionStringKey)) 
    .ShowSql();     
return configuration; 
} 

private FluentConfiguration GetFluentConfiguration() 
{ 
return Fluently.Configure().Database(GetDatabaseConfiguration()) 
    .Mappings(m => 
    { 
    foreach (var assembly in GetAssembliesToLoadMappingsFrom()) 
    m.FluentMappings.AddFromAssembly(assembly); 
    }); 
} 

public global::NHibernate.Cfg.Configuration GetNHibernateConfiguration() 
{ 
var nHibernateConfiguration = GetFluentConfiguration().BuildConfiguration(); 
var namingStrategy = GetNamingStrategy(); 
if (namingStrategy != null) 
    nHibernateConfiguration.SetNamingStrategy(namingStrategy); 
return nHibernateConfiguration; 
} 

public void Build() 
{ 
var schemaExport = new SchemaExport(GetNHibernateConfiguration()); 

schemaExport.Create(true, true); 
} 

GetNHibernateConfiguration()에서 return 문에 중단 점을 배치함으로써, 나는이 nHibernateConfiguration.NamingStrategy 내 전략에 대한 참조가 포함되어 있는지 확인 할 수 있어요. 그러나 해당 전략의 구현 멤버 인 INamingStrategy 모두에 중단 점을 배치하면 그 중 일부는 호출되지 않습니다. 이것은 접두어가없는 생성 된 스키마를보고 확인됩니다.

같은 방법으로 세션 팩토리를 만드는 방법은 CRUD 작업에서도 전략을 무시한다는 것을 보여줍니다.

내가 뭘 분명히 놓치고 있습니까? 내가 NHibernate에 2.1.1.4000

답변

0

을 사용하고

나는 당신의 전략이 너무 복잡하다고 생각합니다. FluentNHibertate를 사용하는 경우 초기화에 TableName 규칙을 제공하십시오.

e.q :

public class TableNameConvention : IClassConvention 
{ 
    public void Apply(IClassInstance instance) 
    { 
     instance.Table(Inflector.Net.Inflector.Pluralize(instance.EntityType.Name)); 
    } 
} 

여기에 사용 : 다시이에 얻을 너무 오래 복용에 대한

public class AutoPersistenceModelGenerator : IAutoPersistenceModelGenerator 
    { 
     /// <summary> 
     /// Get Conf Setup 
     /// </summary> 
     /// <returns> 
     /// Action of AutoMappingExpressions 
     /// </returns> 
     private Action<AutoMappingExpressions> GetSetup() 
     { 
      return c => 
       { 
        c.FindIdentity = type => type.Name == "Id"; 
        c.IsBaseType = this.IsBaseTypeConvention; 
       }; 
     } 

     private Action<IConventionFinder> GetConventions() 
     { 
      return c => 
       { 
        c.Add<PrimaryKeyConvention>(); 
        c.Add<ReferenceConvention>(); 
        c.Add<HasManyConvention>(); 
        c.Add<TableNameConvention>(); 
        c.Add<PropertyNameConvention>(); 
       }; 
     } 

     public AutoPersistenceModel Generate() 
     { 
      var model = 
       new AutoPersistenceModel() 
        .AddEntityAssembly(Assembly.GetAssembly(typeof(User))) 
        .Where(
        this.GetAutoMappingFilter).Conventions.Setup(this.GetConventions()).Setup(this.GetSetup()). 
        UseOverridesFromAssemblyOf<AutoPersistenceModelGenerator>(); 
      return model; 
     } 
+0

isuruceanu, 죄송합니다. 이 문제는 지금 당장 나를위한 배경 스레드 중 하나입니다. 필자는 자동 모델 생성을 사용하지 않기 때문에 솔루션이 정확하게 목표에 있지 않았습니다. 그러나 AutoPersistenceModel을 기본 PersistenceModel 및 관련 조정과 함께 사용하여 작업을 수행했습니다. 나를 올바른 방향으로 가리켜 주셔서 감사합니다. –

관련 문제