2011-02-24 95 views
1

我在这里遇到问题。参考问题?

如何查看下面的代码,我有2个对象:“Pedidos”和“Categoria”。一个“Pedido”包含一个“Categorie”。

我做了测试方法,Pedidos和Categoria都存储在数据库中。大!

但是...... “Pedido.Categoria”字段为空。我哪里错了?

实体:

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;} 
}; 

映射:

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"); 
    } 
} 

测试方法:

 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,伙计们。

回答

3

这是我想到的问题:

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

使用默认约定的主键列将被命名为Id但在这种情况下,它也将是外键Categoria表(SQL标识符不区分大小写)这将导致非常奇怪的关系(每个Pedido与具有相同ID的Categoria相关(如果有的话)。)

在引用上指定的列名引用实体自身使用的外键列,因为可以从该实体的映射中推断出另一个实体中的主键列。因此,为了得到一个正常的许多一对一的关系,你应该为Categoria参考更改列名(以例如“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

牛逼小时ňķ小号!!!!!!我几乎秃顶。它真的起作用了! – Thiago 2011-02-24 13:49:05