2011-02-24 3 views
1

J'ai un problème ici.Problème de référence?

Comme vous pouvez le voir sur le code ci-dessous, j'ai 2 objets: "Pedidos" et "Categoria". Un "Pedido" contait UNE "Categorie".

J'ai fait la méthode de test et les deux Pedidos et Categoria sont stockés sur DB. Génial!

Mais ...... Le champ "Pedido.Categoria" est vide. Où vais-je mal?

: ENTITÉS

public class Categoria : IKeyed<int>{ 
    public virtual int Id { get; set; } 
    public virtual string Nome { get; set; }}; 

public class Pedido : IKeyed<int>{ 
    public virtual int Id { get; set; } 
    public virtual string Assunto { get; set; } 
    public virtual Categoria Categoria { get; set; } 
    public virtual IList<Interacao> Interacao { get; set; } 

    public virtual void addCategoria(Categoria categoria) 
     {Categoria = categoria;} 
}; 

mappings:

public class PedidoMap : ClassMap<Pedido> 
{ 
    PedidoMap() 
    { 
    Table("z1_pedido"); 
    Id(x => x.Id); 
    Map(x => x.Assunto); 
    References(x => x.Categoria).Column("id"); 
    HasMany(x => x.Interacao).LazyLoad().Inverse().Cascade.All(); 
    } 
} 


    public class CategoriaMap : ClassMap<Categoria> 
{ 
    CategoriaMap() 
    { 
     Table("z1_categoria"); 
     Id(x => x.Id); 
     Map(x => x.Nome).Column("nome"); 
    } 
} 

METHODE D'ESSAI:

 public void AddTest() 
    { 
     Repository<Pedido> repository = new Repository<Pedido>(unitOfWork.Session); 
     Repository<Categoria> catRepo = new Repository<Categoria>(unitOfWork.Session); 

     Categoria cat = new Categoria 
     { 
      Nome = "2", 
     }; 
     Pedido pedido = CreatePedido(string.Format("Pedido {0}", 1), 2,cat); 

     repository.Add(pedido); 
     catRepo.Add(cat); 
     unitOfWork.Commit(); 
    } 

    private static Pedido CreatePedido(string assunto, int numberofInteractions, Categoria cat) 
    { 
     Pedido pedido = new Pedido 
     { 
      Assunto = assunto, 
      Categoria = cat, 
     }; 
     pedido.addCategoria(cat); 

     return pedido; 
    } 

thks, les gars.

Répondre

3

C'est le problème que je pense:

References(x => x.Categoria).Column("id"); 

Avec les conventions par défaut la colonne de clé primaire sera nommé Id mais dans ce cas, il sera également clé étrangère à la table Categoria (identifiants SQL sont insensibles à la casse) qui se traduira par une relation très étrange (chaque Pedido est lié à une Categoria avec le même identifiant le cas échéant.)

Le nom de colonne spécifié sur une référence se réfère à la colonne de clé étrangère à utiliser dans l'entité elle-même depuis le colonne clé primaire dans l'autre entité peut être déduite de la cartographie de cette entité. Ainsi, afin d'obtenir un grand nombre à une normale relation que vous devez modifier le nom de la colonne pour la référence Categoria (par exemple à « categoria_id »):

public class PedidoMap : ClassMap<Pedido> 
{ 
    PedidoMap() 
    { 
    Table("z1_pedido"); 
    Id(x => x.Id); 
    Map(x => x.Assunto); 
    References(x => x.Categoria).Column("categoria_id"); 
    HasMany(x => x.Interacao).LazyLoad().Inverse().Cascade.All(); 
    } 
} 
+0

T h a n k s !!!!!! J'étais presque chauve. Ça a vraiment marché! – Thiago