2011-11-07 1 views
1

Fluent NHibernate Automapper Override를 사용하여 엔티티에 고유 한 컬럼을 지정하려고합니다. CodeType의 테스트 클래스의 경우 Type 속성을 고유하게 만들고 싶습니다. 목표는 현재 저장되어있는 CodeType과 동일한 유형 필드를 사용하여 현재 엔터티 위에 겹쳐서 작성되는 "새 CodeType()"을 만드는 것입니다.Fluent에서 고유 컬럼 정의하기 NHibernate Automap Override

I가 다음 CodeType 클래스 :

public class CodeType : SecurableEntity 
{ 

    public virtual string Type { get; set; } 
    public virtual string Description { get; set; } 

    /// <summary> 
    /// This is a placeholder constructor for NHibernate. 
    /// A no-argument constructor must be available for NHibernate to create the object. 
    /// </summary> 
    public CodeType() { } 


} 

나는 다음과 같은 CodeTypeMap 클래스가 있습니다

public AutoPersistenceModel Generate() 
    { 
     var mappings = AutoMap.AssemblyOf<User>(new AutomappingConfiguration()); 
     mappings.IgnoreBase<Entity>(); 
     mappings.IgnoreBase<SecurableEntity>(); 
     mappings.IgnoreBase(typeof(EntityWithTypedId<>)); 
     mappings.Conventions.Setup(GetConventions()); 
     mappings.UseOverridesFromAssemblyOf<AutoPersistenceModelGenerator>(); 
     mappings.UseOverridesFromAssemblyOf<UserMap>(); 
     mappings.UseOverridesFromAssemblyOf<CodeMap>(); 
     mappings.UseOverridesFromAssemblyOf<CodeTypeMap>(); 

     return mappings; 
    } 
: 오버라이드는 다음을 통해, 오토 맵에 적용되는

public class CodeTypeMap : IAutoMappingOverride<CodeType> 
{ 
    public void Override(AutoMapping<CodeType> mapping) 
    { 
     //Doesn't work. Need a way to specify a column as unique. 
     mapping.Map(m => m.Type).Unique(); 
    } 
} 

"type"이 "existingTyp"인 기존 레코드를 업데이트하려면 다음 코드를 사용하고 싶습니다. 이자형".

SecurableEntityRepository<CodeType> ctr = new SecurableEntityRepository<CodeType>(); 
CodeType ct = new CodeType(); 
ct.type = "existingType"; 
ct = ctr.SaveOrUpdate(ct); 

입력란의 Hibernate 키를 고유하게 만들려면 어떻게해야합니까?

이것이 가능합니까?

+0

당신은 당신이 이런 식으로 뭔가를 할 건가요 수있다 "업데이트 CodeType 세트의 형태 = 'existingType'유형 = '형' "? –

+0

또한 모든 매핑이 필요하다고 확신하지 않습니다 .UseOverridesFromAssemblyOf ();'. 모든 오버라이드가 동일한 어셈블리에있는 경우 해당 어셈블리 중 하나만 필요합니다. –

답변

0

짧은 대답, 당신이 원하는 것은 매우 가능성이 있기 때문에 코드에서 처리해야하는 것입니다. 매번 당신은 당신이 이미

SecurableEntityRepository<CodeType> ctr = new SecurableEntityRepository<CodeType>(); 
CodeType ct = ctr.GetByType("existingType"); 
if (ct == null) 
{ 
    ct = new CodeType { type = "existingType" }; 
} 
ctr.SaveOrUpdate(ct); 

또는

SecurableEntityRepository<CodeType> ctr = new SecurableEntityRepository<CodeType>(); 
CodeType ct = ctr.GetByType("existingType"); 
if (ct != null) 
{ 
    ctr.Detach(ct); 
    ctr.Merge(new CodeType{ type = "existingType" }); 
} 

또는

SecurableEntityRepository<CodeType> ctr = new SecurableEntityRepository<CodeType>(); 
int ctId = ctr.GetIdByType("existingType"); 
if (ct != 0) 
{ 
    ctr.Merge(new CodeType{ Id = ctId, type = "existingType" }); 
} 

가있는 경우 DB를 확인해야 새로운 CodeType을 만들고 다르게 기록 될 수있는 몇 가지가있다

  • public CodeType() { } 제거하거나 도메인에 필요하지 않은 경우 protected CodeType() { }했다

  • public AutoPersistenceModel Generate() 
    { 
        return AutoMap.AssemblyOf<User>(new AutomappingConfiguration()) 
         .IgnoreBase<Entity>() 
         .IgnoreBase<SecurableEntity>() 
         .IgnoreBase(typeof(EntityWithTypedId<>)) 
         .Conventions.Setup(GetConventions()) 
         .UseOverridesFromAssemblyOf<AutoPersistenceModelGenerator>(); 
    }