2015-03-14 2 views
1

étrangère Ma mise en page de base de données ressemble à ceci:C# clé primaire Fluent NHibernate est la clé

Users 
------------ 
|UserId | <-PK 
|FirstName | 
|LastName | 
|MiddleName| 
|Email  | 
------------ 

Admins 
------------ 
|UserId | <-PK/FK to Users 
------------ 

Je veux juste la capacité de mettre dans l'ID unique de la table Admins pour désigner si cet utilisateur est un administrateur.

Voici mon code Fluent NHibernate:

public class Users 
{ 
    public virtual string UserId { get; set; } 
    public virtual string FirstName { get; set; } 
    .... 
} 

public class UserMappings : ClassMap<Users> 
{ 
    public UserMappings() 
    { 
     Id(x => x.UserId).Column("UserId").Not.Nullable(); 

     Map(x => x.FirstName).Column("FirstName").Not.Nullable(); 
     Map(x => x.MiddleName).Column("MiddleName").Nullable(); 
     .... 
    } 
} 

public class Admins 
{ 
    public virtual Users User { get; set; } 
} 

public class AdminMappings : ClassMap<Admins> 
{ 
    public AdminMappings() 
    { 
     Id(x => x.User).GeneratedBy.Foreign("Users"); 

     HasOne(x => x.User).Constrained(); 
    } 
} 

Malheureusement, quand je lance, je reçois cette erreur:

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

Ce que je veux est que si je fais:

var admin; 
admin.user <= instance of user to get name, email, etc... 

Comment pourrais-je accomplir cela?

EDIT: J'ajouté et je l'ai eu à travailler si je ne sais pas si son idéal:

public AdminMappings() 
{ 
    Id(x => x.UserId).Column("UserId"); 
    HasOne(x => x.User).Constrained(); 
} 

public UserMappings() 
{ 
    Id(x => x.UserId).Column("UserId").Not.Nullable(); 
    Map(x => x.FirstName).Column("FirstName").Not.Nullable(); 
    Map(x => x.MiddleName).Column("MiddleName").Nullable(); 
    ... 
    HasOne(x => x.Admin).Cascade.All(); 
} 

public class Admins 
{ 
    public virtual string UserId { get; set; } 

    public virtual Users User { get; set; } 
} 

public class Users 
{ 
    public virtual string UserId { get; set; } 
    public virtual string FirstName { get; set; } 
    .... 
    public virtual Admins Admin { get; set; } 
} 

La seule réserve est que je dois effectivement régler le UserId et l'utilisateur afin d'économiser l'enregistrement Admin plutôt que juste le UserId et le faire automatiquement tirer l'enregistrement de l'utilisateur pour moi.

Répondre

3

NHibernate peut gérer FK dans les clés primaires

public class AdminMappings : ClassMap<Admins> 
{ 
    public AdminMappings() 
    { 
     CompositeId().KeyReference(x => x.User, "UserId"); 
    } 
} 

Ne pas oublier de mettre en œuvre et égaux GetHashCode sur Administrateur appropiatly à utiliser User.Id