参考问题?

时间:2011-02-24 12:46:18

标签: c# fluent-nhibernate asp.net-mvc-3 linq-to-nhibernate

我在这里遇到了问题。

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

我做了测试方法,Pedidos和Categoria都存储在DB上。太好了!

可是...... “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;
    }

好吧,伙计们。

1 个答案:

答案 0 :(得分:3)

我认为这是个问题:

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

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

在Reference上指定的列名称是指在实体本身中使用的外键列,因为可以从该实体的映射推断出另一个实体中的主键列。因此,为了获得正常的多对一关系,您应该更改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();
  }
}