Ссылка проблема? - PullRequest
       3

Ссылка проблема?

1 голос
/ 24 февраля 2011

У меня проблема здесь.

Как вы можете видеть из кода ниже, у меня есть 2 объекта: "Pedidos" и "Категория".«Pedido» записано ОДНО «Категорией».

Я выполнил тестовый метод, и Pedidos, и Категория хранятся в БД.Отлично!

Но ...... Поле "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 Ответ

3 голосов
/ 24 февраля 2011

Я думаю, что это проблема:

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

При соглашениях по умолчанию столбец первичного ключа будет иметь имя Id, но в этом случае он также будет внешним ключом таблицы категорий (идентификаторы SQL не чувствительны к регистру), что приведет к очень странному отношению (каждый Pedido является связан с категорией с таким же идентификатором, если таковой имеется.)

Имя столбца, указанное в Ссылке, относится к столбцу внешнего ключа, который будет использоваться в самом объекте, поскольку столбец первичного ключа в другом объекте может быть выведен из сопоставления этого объекта. Поэтому, чтобы получить нормальное отношение «многие к одному», вы должны изменить имя столбца для ссылки «Категория» (например, на «category_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();
  }
}
...