I use the Compositeid() of Fluentnhibernate, and use the Ference. Hasmany is if it’s a collection I want to upload together. By your code you should already know the difference.
CompositeId()
.KeyReference(x => x.Id, "idB")//se for uma referencia(entidade)
.KeyProperty(x => x.Id2, "idB2");//se for uma propriedade(int/long)
Follow an example if it is a class with Keyproperty and Keyreference:
(Esse Link)
public class TestChildMap : ClassMap<TestChild>
{
public TestChildMap()
{
Table("TestChild");
CompositeId()
.KeyProperty(x => x.ChildName, "ChildName")
.KeyReference(x => x.Parent, "TestParentId");
Map(x => x.Age);
References(x => x.Parent, "TestParentId")
.Not.Insert(); // will avoid "Index was out of range" error on insert
}
Here’s an example if it’s a class with Keyreference:
public class MapEmpresaProduto : MapBase<EmpresaProduto>
{
public MapEmpresaProduto()
{
Table("EmpresaProduto");
CompositeId()
.KeyReference(x => x.Empresa, "IdEmpresa")
.KeyReference(x => x.Produto, "IdProduto");
References(x => x.Empresa)
.Not.Nullable()
.Fetch.Join()
.Cascade.SaveUpdate()
.Column("IdEmpresa")//linko o KeyReference(x => x.Empresa, "IdEmpresa") atraves do column name.
.ReadOnly();
References(x => x.Produto)
.Not.Nullable(
)
.Fetch.Join()
.Cascade.SaveUpdate()
.Column("IdProduto")
.ReadOnly();
}
}
My entity Loan:
public class EmpresaProduto : EntidadeAuditavelSemId
{
public virtual Produto Produto { get; set; }
public virtual Empresa Empresa { get; set; }
protected EmpresaProduto()
{
}
public EmpresaProduto(Empresa empresa, Produto produto) : this()
{
Produto = produto;
Empresa = empresa;
}
public override bool Equals(object entity)
{
if (entity == null || !(entity is EmpresaProduto))
{
return false;
}
// Mesmas instâncias devem ser consideradas iguais
if (ReferenceEquals(this, entity))
{
return true;
}
// Objetos transientes não são considerados iguais
var other = (EmpresaProduto)entity;
var typeOfThis = GetType();
var typeOfOther = other.GetType();
if (!typeOfThis.IsAssignableFrom(typeOfOther) && !typeOfOther.IsAssignableFrom(typeOfThis))
{
return false;
}
return Produto.Id.Equals(other.Produto.Id) && Empresa.Id.Equals(other.Empresa.Id);
}
public override int GetHashCode()
{
unchecked
{
var hash = GetType().GetHashCode();
hash = (hash * 31) ^ Produto.GetHashCode();
hash = (hash * 31) ^ Empresa.GetHashCode();
return hash;
}
}
}
OBS: I have done many tests and Sqlserver so far stood out, being index created with strange and wrong names in MYSQL and postgress. So if your seat is not sqlserver be careful. (The problem is really in the connector and not in the Fluent itself).
Were you able to solve the problem with my answer below? If yes select my answer as solved. Otherwise I can still help you with something.
– Danilo Breda
I’ll try now... I’ve already put the result.
– Flavio Vissoto
Danilo, I’m going to need to make some modifications to the structure of my application to perform the tests. As soon as I’m done, I’ll let you know.
– Flavio Vissoto