我在这里遇到了问题。
如何在下面的代码中看到,我有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;
}
好吧,伙计们。
答案 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();
}
}