2

MVC 3 ASP.NET 프로젝트를 위해 NHibernate를 사용하여 커스텀 멤버십 제공자를 만들었습니다.NHibernate는 X 타입을 결정할 수 없습니다

사용자 클래스에 몇 가지 문제가 있습니다.

namespace FluentNHibernateMembershipProvider.Models 
{ 
    public class User 
    { 
     public virtual int UserId { get; protected set; } 
     public virtual string Username { get; set; } 
     public virtual DateTime CreateDate { get; set; } 
     public virtual string ConfirmationToken { get; set; } 
     public virtual bool IsConfirmed { get; set; } 
     public virtual DateTime LastPasswordFailureDate { get; set; } 
     public virtual int PasswordFailuresSinceLastSuccess { get; set; } 
     public virtual string Password { get; set; } 
     public virtual DateTime PasswordChangeDate { get; set; } 
     public virtual string PasswordSalt { get; set; } 
     public virtual string PasswordVerificationToken { get; set; } 
     public virtual DateTime PasswordVerificationTokenExpirationDate { get; set; } 
     public virtual IList<Role> Roles { get; set; } 

     public User() 
     { 
      Roles = new List<Role>(); 
     } 

    } 
} 

내 UserMappings.cs 파일은 다음과 같습니다

_sessionFactory = cfg.BuildSessionFactory(); 

User.cs 파일은 다음과 같습니다 :

Could not determine type for: FluentNHibernateMembershipProvider.Models.User, FluentNHibernateMembershipProvider, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null, for columns: NHibernate.Mapping.Column(User)

오류가 나는 호출 할 때 발생합니다 나는 다음과 같은 오류가 발생합니다 이 :

namespace FluentNHibernateMembershipProvider.Mappings 
{ 
    public class UserMappings : ClassMap<User> 
    { 
     public UserMappings() 
     { 
      Id(c => c.UserId); 
      Map(c => c.Username).Unique(); 
      Map(c => c.CreateDate).Nullable(); 
      Map(c => c.ConfirmationToken).Nullable(); 
      Map(c => c.IsConfirmed).Default("0"); 
      Map(c => c.LastPasswordFailureDate).Nullable(); 
      Map(c => c.PasswordFailuresSinceLastSuccess).Default("0"); 
      Map(c => c.Password); 
      Map(c => c.PasswordChangeDate).Nullable(); 
      Map(c => c.PasswordSalt); 
      Map(c => c.PasswordVerificationToken); 
      Map(c => c.PasswordVerificationTokenExpirationDate); 
      HasManyToMany<Role>(c => c.Roles).Cascade.All().Inverse().Table("UsersInRole"); 
     } 
    } 
} 

--- UPDA

namespace FluentNHibernateMembershipProvider.Models 
{ 
    public class Role 
    { 
     public virtual int RoleId { get; protected set; } 
     public virtual string RoleName { get; set; } 
     public virtual IList<User> Users { get; set; } 

     public Role() 
     { 
      Users = new List<User>(); 
     } 
    } 
} 

RoleMappings.cs Role.cs

:

namespace FluentNHibernateMembershipProvider.Mappings 
{ 
    public class RoleMappings : ClassMap<Role> 
    { 
     public RoleMappings() 
     { 
      Id(c => c.RoleId); 
      Map(c => c.RoleName); 
      HasManyToMany<User>(c => c.Users).Cascade.All().Table("UsersInRole"); 
     } 
    } 
} 

OAuthToken.cs :

namespace FluentNHibernateMembershipProvider.Models 
{ 
    public class OAuthToken 
    { 
     public virtual string Provider { get; set; } 
     public virtual string ProviderUserId { get; set; } 
     public virtual User User { get; set; } 
     public virtual string Token { get; set; } 
     public virtual string Secret { get; set; } 

     public override bool Equals(object obj) 
     { 
      if (ReferenceEquals(null, obj)) return false; 
      if (ReferenceEquals(this, obj)) return true; 
      if (obj.GetType() != typeof(OAuthToken)) return false; 
      return Equals((OAuthToken)obj); 
     } 

     public virtual bool Equals(OAuthToken other) 
     { 
      if (ReferenceEquals(null, other)) return false; 
      if (ReferenceEquals(this, other)) return true; 
      return other.Provider == Provider && other.ProviderUserId == ProviderUserId; 
     } 

     public override int GetHashCode() 
     { 
      unchecked 
      { 
       return (Provider.GetHashCode() * 397)^ProviderUserId.GetHashCode(); 
      } 
     } 
    } 
} 
TED는 --- 여기

는 다른 두 매핑 클래스입니다

OAuthTokenMappings.cs :

namespace FluentNHibernateMembershipProvider.Mappings 
{ 
    public class OAuthTokenMappings : ClassMap<OAuthToken> 
    { 
     public OAuthTokenMappings() 
     { 
      CompositeId() 
       .KeyReference(c => c.Provider, "Provider") 
       .KeyReference(c => c.ProviderUserId, "ProviderUserId"); 
      Map(c => c.Token); 
      Map(c => c.User); 
      Map(c => c.Secret); 
     } 
    } 
} 

--- 업데이트] 최종 솔루션 --- 복합 키가 허용되지 않는 두 개의 문자열 변수 때문에

내가 약간 OAuthToken 및 OAuthTokenMappings을 변경했다, 그래서 이것은 나의 최종 해결책 '이었다 :

OAuthToken.cs :

public class OAuthToken 
{ 

    public virtual int Id { get; protected set; } 
    public virtual string Provider { get; set; } 
    public virtual string ProviderUserId { get; set; } 
    public virtual User User { get; set; } 
    public virtual string Token { get; set; } 
    public virtual string Secret { get; set; } 

    public override bool Equals(object obj) 
    { 
     if (ReferenceEquals(null, obj)) return false; 
     if (ReferenceEquals(this, obj)) return true; 
     if (obj.GetType() != typeof(OAuthToken)) return false; 
     return Equals((OAuthToken)obj); 
    } 

    public virtual bool Equals(OAuthToken other) 
    { 
     if (ReferenceEquals(null, other)) return false; 
     if (ReferenceEquals(this, other)) return true; 
     return other.Provider == Provider && other.ProviderUserId == ProviderUserId; 
    } 

    public override int GetHashCode() 
    { 
     unchecked 
     { 
      return (Provider.GetHashCode() * 397)^ProviderUserId.GetHashCode(); 
     } 
    } 
} 

OAuthTokenMappings.cs :

public class OAuthTokenMappings : ClassMap<OAuthToken> 
{ 
    public OAuthTokenMappings() 
    { 
     Id(c => c.Id); 
     Map(c => c.Provider).UniqueKey("OAuthTokenUniqueKey"); 
     Map(c => c.ProviderUserId).UniqueKey("OAuthTokenUniqueKey"); 
     Map(c => c.Token); 
     HasOne(c => c.User); 
     Map(c => c.Secret); 
    } 
} 
+1

문제는 사용자 클래스를 말합니다 다른 매핑 될 수있다. 그런 매핑이 있습니까? 다른 매핑을 제거하고 한 번에 하나씩 추가하여 어느 것이 문제인지 파악할 수 있습니다. – JTMon

+0

두 개의 다른 클래스와 해당 매핑을 사용하여 질문을 업데이트했습니다. – Gunnar

답변

10

나는 문제가이 매핑에서 오는 생각 :

public OAuthTokenMappings() 
    { 
     CompositeId() 
      .KeyReference(c => c.Provider, "Provider") 
      .KeyReference(c => c.ProviderUserId, "ProviderUserId"); 
     Map(c => c.Token); 
     Map(c => c.User); //This is most likely the culprit. Should be a References or HasOne mapping 
     Map(c => c.Secret); 
    }