2008-10-05 6 views
5

방금 ​​NHibernate와 유창한 인터페이스에 빠져 들었습니다. 후자는 리팩토링 지원 (XML 파일이 더 이상 필요 없음)과 함께 매우 멋진 매핑을 가능하게합니다.NHibernate 용 Fluent 및 XML 매핑을 결합하십시오.

아무도 완벽하지 않으므로 유창하게 많은 대다수 매핑이 누락되었습니다. 아무도 그것이 이미 있는지 알고 있습니까? 그렇다면 코드의 간단한 라인이 좋을 것입니다.

그러나 질문의 ​​헤더를 고수하기 위해 유창하고 일반적인 NHibernate 매핑을 결합하는 방법이 있습니까?

현재 유창한 테스트 환경에서는 다음 줄을, 유창한 (XML 매핑 포함) 테스트에서는 두 번째 코드 블록을 사용합니다. 어떻게 유창함없이

 var cfg = new Configuration(); 
     cfg.AddProperties(MsSqlConfiguration.MsSql2005.ConnectionString.Is(_testConnectionstring).ToProperties()); 
     cfg.AddMappingsFromAssembly(typeof(CatMap).Assembly); 
     new SchemaExport(cfg).Create(true, true); 

     var persistenceModel = new PersistenceModel(); 
     persistenceModel.addMappingsFromAssembly(typeof(CatMap).Assembly); 
     IDictionary<string, string> properties = MsSqlConfiguration.MsSql2005.UseOuterJoin().ShowSql().ConnectionString.Is(_testConnectionstring).ToProperties(); 
     properties.Add("command_timeout", "340"); 

     session = new SessionSource(properties, persistenceModel).CreateSession(); 

... 그것 뿐이다

 config = new Configuration(); 
     IDictionary props = new Hashtable(); 

     props["connection.provider"] = "NHibernate.Connection.DriverConnectionProvider"; 
     props["dialect"] = "NHibernate.Dialect.MsSql2005Dialect"; 
     props["connection.driver_class"] = "NHibernate.Driver.SqlClientDriver"; 
     props["connection.connection_string"] = "Server=localhost;initial catalog=Debug;Integrated Security=SSPI"; 
     props["show_sql"] = "true"; 
     foreach (DictionaryEntry de in props) 
     { 
      config.SetProperty(de.Key.ToString(), de.Value.ToString()); 
     } 
     config.AddAssembly(typeof(CatMap).Assembly); 

     SchemaExport se = new SchemaExport(config); 
     se.Create(true, true); 

     factory = config.BuildSessionFactory(); 
     session = factory.OpenSession(); 

... ... 가능한 경우를 유창하게 구사하고, 그렇지 않으면 XML 사용 크리스

PS를 유창하게 말할 수 : 정말 이 사이트와 마찬가지로 GUI는 완벽하며 모든 기사의 품질은 놀라 울 정도입니다. 나는

답변

2

매핑 Foo에서 Baa에 ... 그것은 거대한 :-) 등록해야 될 것이라고 생각 :

HasManyToMany<Baa> (x => Baas) 
    .AsBag () //can also be .AsSet() 
    .WithTableName ("foobar") 
    .WithParentKeyColumn ("fooId") 
    .WithChildKeyColumn ("barId") ; 

체크 아웃 ClassMapXmlCreationTester의 예제를 - 그들은 또한 기본 열 이름이 무엇인지 보여줍니다.

2

ManyToAny 's는 현재 (작성 시점을 기준으로) 구현되지 않았습니다.

유창하고 유창하지 않은 매핑의 설정과 관련하여 거의 첫 번째 예제가 있습니다.

var cfg = MsSqlConfiguration.MsSql2005 
    .ConnectionString.Is(_testConnectionstring) 
    .ConfigureProperties(new Configuration()); 

cfg.AddMappingsFromAssembly(typeof(CatMap).Assembly); // loads hbm.xml files 

var model = new PersistenceModel(); 
model.addMappingsFromAssembly(typeof(CatMap).Assembly); // loads fluent mappings 
mode.Configure(cfg); 

new SchemaExport(cfg).Create(true, true); 

가장 큰 차이점은 SchemaExport가 마지막이라는 것입니다. 귀하의 첫 번째 예제가 실제로 유창한 매핑을로드하고 있다고 가정하지만, 그 시점까지 이미 스키마를 생성했습니다.

2

당신은 완전히 Fluent NHibernate 내에서 원하는 것을 정확히 할 수 있습니다.

다음 코드는 HBM (xml) 매핑 파일, 유창한 매핑 및 가능한 여러 어셈블리의 규칙을 찾는 세션 팩토리를 유창하게 구성하기 위해 Fluent NHibernate 구문을 사용합니다.

var _mappingAssemblies = new Assembly[] { typeof(CatMap).Assembly }; 
var _autoPersistenceModel = CreateAutoPersistenceModel(); 
Fluently.Configure() 
     .Database(MsSqlConfiguration.MsSql2005.ConnectionString(_testConnectionstring)) 
     .Mappings(m => 
        { 
         foreach (var assembly in _mappingAssemblies) 
         { 
          m.HbmMappings.AddFromAssembly(assembly); 
          m.FluentMappings.AddFromAssembly(assembly) 
           .Conventions.AddAssembly(assembly); 
         } 
         m.AutoMappings.Add(_autoPersistenceModel); 
        }) 
     .ExposeConfiguration(c => c.SetProperty("command_timeout", "340")) 
     .BuildSessionFactory(); 

사용 가능한 많은 다른 옵션도 있습니다 Fluent NHibernate Database Configuration