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);
}
}
문제는 사용자 클래스를 말합니다 다른 매핑 될 수있다. 그런 매핑이 있습니까? 다른 매핑을 제거하고 한 번에 하나씩 추가하여 어느 것이 문제인지 파악할 수 있습니다. – JTMon
두 개의 다른 클래스와 해당 매핑을 사용하여 질문을 업데이트했습니다. – Gunnar