参考问题?

发布于 2024-10-18 22:36:27 字数 2050 浏览 1 评论 0原文

我这里有问题。

您可以在下面的代码中看到,我有 2 个对象:“Pedidos”和“Categoria”。一个“Pedido”包含一个“类别”。

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

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

谢谢,伙计们。

I'm having a problem here.

How you can see on the code below, I have 2 objects: "Pedidos" and "Categoria". A "Pedido" contais ONE "Categorie".

I did the test Method and both Pedidos and Categoria are stored on DB. Great!

But......
The field "Pedido.Categoria" is empty. Where am I going wrong?

ENTITIES:

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

TEST METHOD:

        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, guys.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

栖迟 2024-10-25 22:36:27

这就是我认为的问题:

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

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

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

This is the problem I think:

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

With the default conventions the primary key column will be named Id but in this case it will also be foreign key to the Categoria table (SQL identifiers are case insensitive) which will result in a very weird relation (each Pedido is related to a Categoria with the same id if any.)

The column name specified on a Reference refers to the foreign key column to use in the entity itself since the primary key column in the other entity can be inferred from the mapping of that entity. So in order to get a normal many-to-one relation you should change the column name for the Categoria reference (to for example "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();
  }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文