2011-02-04 4 views
4

이미 온 포인트 응답이 있지만 나도 찾지 못해서 사과드립니다. 나는 NH3를 사용하고 있는데 클래스가 특정 인터페이스를 구현하는 엔티티에 Set을 추가하고자하는 유스 케이스가있다. 세션 빌더를 생성하기 전에 이러한 변경을 할 수 있도록 구성 빌더 클래스가 있습니다.런타임시 NHibernate 클래스 확장/수정

public class Person : IHasExtraItems 
{ 
    public Person() 
    { 
     this.ExtraItems = new HashSet<ExtraItem>(); 
    } 
    public virtual Guid Id { get; set; } 
    public virtual string Name { get; set; } 
    public virtual DateTime Birthdate { get; set; } 
    public virtual ICollection<ExtraItem> ExtraItems { get; protected set; } 
} 

public class ExtraItem 
{ 
    public virtual Guid Id { get; set; } 
} 

그리고이 예제 매핑 :이 감소 예를 감안할 때

<class name="Person"> 
    <id name="Id"> 
     <generator class="guid"/> 
    </id> 
    <property name="Name"/> 
    <property name="Birthdate"/> 
    <set name="Extra" table="PersonExtraItems" cascade="all"> 
     <key column="PersonId"/> 
     <many-to-many column="ExtraItemId" class="ExtraItem" unique="true" /> 
    </set> 
    </class> 

내가 투명 많은 클래스에이 기능을 적용 할 수 있기를 원하기 때문에

- 단지 인터페이스를 구현하여 - - 매핑에 "ExtraItem"을 넣고 싶지 않습니다. 대신 런타임에 추가하려고합니다. 그래서 XML 매핑에서 속성을 제거하면 런타임에 어떻게 추가 할 수 있습니까? http://ayende.com/Blog/archive/2008/05/01/Dynamic-Mapping-with-NHibernate.aspx

을하지만 많은 세트에 많은 매핑되지 않으며, 나의 미약 한 뇌가 메모리를 해독 할 수 없었다 :이 내가 만들려고 노력하고있어 변화의 설명 정확히 유형의

매핑 표현 nhibernate는 효과를 생성하는 데 사용합니다. 키, 그러나 XML 매핑 버전의 작품 널 때문 디버거에 표시 속성 테스트에서

foreach (var cls in cfg.ClassMappings) 
{ 
    if (typeof(IHasExtraItems).IsAssignableFrom(cls.MappedClass)) 
    { 
     NHibernate.Mapping.Property property = new NHibernate.Mapping.Property(); 
     NHibernate.Mapping.Set value = new NHibernate.Mapping.Set(cls); 
     value.Role = cls.EntityName + ".ExtraItems"; 
     value.IsGeneric = true; 
     var table = new Table(); 
     table.Name = cls.MappedClass.Name + "ExtraItems"; 
     value.CollectionTable = table; 
     value.GenericArguments = new Type[] { typeof(ExtraItem) }; 
     value.IsOptimisticLocked = true; 
     value.IsLazy = true; 
     mappings.AddCollection(value); 
     property.Value = value; 

     property.Name = "ExtraItems"; 
     property.PersistentClass = cls; 
     property.Cascade = "all"; 
     cls.AddProperty(property); 
    } 
} 

일치하려고 노력을 기반으로, 내가 왔어요 가장 가까운,이 런타임 오류가 발생, 변경을 수행 할 때 어느 정도 동일하게 보입니다.

보너스 포인트 : 저는 조인 된 테이블이 필요하기 때문에 특별히 many-to-many를 원합니다. 이렇게하면 성능을 위해 실제 외래 키가있는 확장 데이터에 엔터티를 매핑 할 수 있습니다. ExtraItem은 실제로 엔티티가 아닌 값 유형이어야하지만 XML로 매핑하는 방법을 알아낼 수는 없습니다.

보너스 포인트, 파트 2 : conforM으로이 작업을 수행 할 수 있습니까? 기존의 모든 매핑을 conforM으로 전환하고 싶지 않아서 기존의 XML 매핑과 conforM을 섞어서 기존 매핑을 수정하는 방법을 찾지 못했습니다. Fluent는 또 다른 옵션이지만, NH3를 사용하고 있으며 Fluent가 아직 지원하지 않는다고 생각합니다.

미리 감사드립니다.

EDIT 나는 세트의 요소를 정의하지 않는다는 것이 확실합니다. 그러나, 나는 세트의 요소들을 적절하게 정의하는 방법을 식별 할 수 없다.

답변

1

NH3에는 유창한 빌드가 있으므로 사용할 수 있습니다. 유창하게 사용하는 경우 규칙을 사용하여 쉽게이 작업을 수행 할 수 있습니다. 보너스 포인트 섹션에서 언급 했으니 아마도 다른 모습을 보여 주어야할까요?

관련 문제