2010-01-26 2 views
1

NHibernate를 통해 ASP.NET MVC 응용 프로그램 내에서 UserId 및 UserName에 액세스 할 수 있도록 Fluent NHibernate 1.0 RTM에서 사용자 엔터티를 매핑하려고합니다.Fluent NHibernate를 사용하여 aspnet_Users 테이블의 부분을 매핑하는 방법

나는이 :

public class User 
{ 
    public virtual Guid UserId { get; protected set; } 
    public virtual string UserName { get; protected set; } 
} 

그것은 단지 관련 컬럼과 aspnet_Users 테이블을 나타냅니다

매핑 할 수 있습니다. 이것은 자동 매핑되지 않는 유일한 개체입니다. 여기 내 매핑은 다음과 같습니다.

public class UserMap : ClassMap<User> 
{ 
    public UserMap() 
    { 
     Id(x => x.UserId); 
     Map(x => x.UserName); 
     WithTable("aspnet_Users"); 
    } 
} 

다른 모든 것들은 관례에 따라 자동 완성되고 있습니다.

public class PrimaryKeyConvention : IIdConvention 
{ 
    public void Apply(IIdentityInstance instance) 
    { 
     instance.Column(instance.Property.ReflectedType.Name + "Id"); 
     instance.UnsavedValue(System.Guid.Empty.ToString()); 
     instance.GeneratedBy.GuidComb(); 
    } 
} 

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

매핑 프로세스를 잘 작성 (모든 자동 매핑 앞에 오는)를 ClassMap 코드를 실행 한 후 실패의 TableNameConvention 코드에 의해 선행 된 PrimaryKeyConvention 코드 뒤에 : 여기

내 PrimaryKeyConvention 및 TableNameConvention 있습니다. instance.Property가 null이기 때문에 실패는 PrimaryKeyConvention에 있습니다. if (instance.Property! = null)을 시도했지만 은 "필요한 속성 'class'is missing"오류와 함께 일찍 매핑 프로세스를 종료합니다. 나는 또한 if (instance.EntityType! = typeof (User))를 TableNameConvention에 넣었지만 아무런 차이가 없을 때 꺼냈다.

여기에 무슨 일이 일어나고 있습니까? 우선, 왜 AutoMapping이 ClassMap 규칙을 호출하는 프로세스입니까? 둘째로, PrimaryKenConvention가 instance.Property == null을 전달하는 이유는 무엇입니까? 맵핑 프로세스가 AutoMapping + 규칙을 사용하여 나머지 엔티티를 계속 매핑하도록 맵을 처리하려면 어떻게해야합니까?

참고 : 1.0 RTM에 대한 리팩터 이전의 FNH 이전 버전에서는이 기능이 모두 몇 달 동안 작동했습니다.

답변

1

나는 이에 대한 해답을 알고 있습니다. PrimaryKeyConvention가 instance.EntityName 오히려 그 instance.Property를 사용하여 열 이름을 설정하는 것을

public UserMap() 
{ 
    Id(x => x.UserId); 
    Map(x => x.UserName); 
    Table("aspnet_Users"); 
} 

public class PrimaryKeyConvention : IIdConvention 
{ 
    public void Apply(IIdentityInstance instance) 
    { 
     instance.Column(instance.EntityType.Name + "Id"); 
     instance.UnsavedValue(System.Guid.Empty.ToString()); 
     instance.GeneratedBy.GuidComb(); 
    } 
} 

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

참고. 후자는 UserMap에 대해 null이므로 충돌 할 수 있습니다.

이 방법은 (null! = instance.Property)에 조건문을 사용하고 instance.Property.ReflectedType.Name 행을 유지하는 것보다 낫지 만 둘 다 작동합니다. 해당 경로를 선택하는 경우 사용자 맵에 명시 적으로 열 이름을 설정해야합니다.

public UserMap() 
{ 
    Id(x => x.UserId).Column("UserId") 
        .GeneratedBy.Assigned(); 
    Map(x => x.UserName).Column("UserName"); 
    Table("aspnet_Users"); 
} 
0

자동 매핑을 사용하지 않지만 IAutoMappingOverride을 구현하여 사용자를 매핑해야한다고 생각합니다. 예 :

public class UserMap : IAutoMappingOverride<User> 
{ 
    public void Override(AutoMapping<User> mapping) 
    { 
     mapping.Id(x => x.UserId); 
     mapping.Map(x => x.UserName); 
     mapping.WithTable("aspnet_Users"); 
    } 
} 
+0

안녕하세요 Jamie. 재정의는 자동 매너가 엔티티로 매핑 할 객체에만 적용됩니다. Entity라는 기본 객체를 사용하여 Id, CreatedDate 등을 캡슐화하고 모든 엔티티를 상속합니다. 그러나 내 사용자 개체는 디자인이 aspnet_Users 테이블에 의해 어떻게 지정되는지를 확인하는 엔터티 요구 사항을 따르지 않으므로 아무 것도 상속하지 않습니다. 자동 매핑을 설정할 때 .ignoreBase 을 사용합니다. 따라서 사용자가 처음부터 매핑되지 않으므로 권장 방식대로 재정의 할 수 없습니다. –

관련 문제