Nibernato fluente se juntou às mesas individuais
-
25-09-2019 - |
Pergunta
Eu acho que essa é uma pergunta moderada de neófitos. Eu uso o Nibernate/Fluentnhibernate há cerca de 6 meses ou mais e acho que tenho uma compreensão justa do básico. Agora estou empurrando um pouco além. Tenho certeza de que isso está documentado, mas já passei várias horas no Google e não descobri bastante.
Eu tenho aula simples, chame de simples:
public class Simple
{ public string Name { get; set;}
public string Desc { get; set; }
public string Status { get; set;}
}
O status é realmente restrito a ser um de um pequeno conjunto de valores: "ativo", "hold" e "fechado". No esquema do banco de dados, tenho uma tabela simples somente leitura chamada ROTOFITSTATUS:
CREATE TABLE [dbo].[RetrofitStatus](
[Status] [nvarchar](10) NOT NULL,
[SortOrder] [smallint] NOT NULL,
CONSTRAINT [PK_RetrofitStatus] PRIMARY KEY CLUSTERED
(
[Status] ASC
)
E há uma restrição de chave estrangeira na tabela simples para garantir que o status esteja no retrofitstatus.
O objetivo da tabela de retrofitstatus é incluir a coluna Sortorder para que eu possa fazer (no SQL)
SELECT * from Simple s join RetrofitStatus r on r.Status=s.Status ORDER BY r.SortOrder
e classifique meus resultados em uma ordem de exibição (por exemplo, todas as entradas ativas primeiro, depois as entradas em seguida e depois as entradas fechadas, já que estou classificando uma ordem lógica, não alfabética ou qualquer outra coisa reconhece facilmente).
Minha pergunta é: como faço para modelar esse objeto e relacionamento no FNH? Posso adicionar a propriedade Sortorder à minha definição simples e fazer uma visão que represente isso, mas o que acontecerá quando eu tentar inserir novos objetos simples na tabela? Obviamente, não quero tentar inserir a propriedade Sortorder. Eu acho que preciso usar o elemento Nhib de alguma forma, mas, novamente, não estou claro para onde isso precisa ir, o que acontece na inserção e como fazê -lo em fluente?
Vou tentar experimentar a tentativa e o erro, mas pensei que talvez alguém que saiba o que está fazendo (o que não sei) possa me apontar na direção certa e me economizar algum tempo. Obrigado pela ajuda.
Solução
Supondo que você tenha um Simple
Classe modificada da seguinte forma (eu não tinha certeza do que você estava fazendo com uma chave):
public class Simple
{
public int Id { get; set; }
public string Name { get; set; }
public string Desc { get; set; }
public string Status { get; set;
public int SortOrder { get; set; }
}
Você pode mapear assim:
public SimpleMap : ClassMap<Simple>
{
Id(x => x.Id).Unique().GeneratedBy.Native();
Map(x => x.Name);
Map(x => x.Desc);
Join("RetrofitStatus", join =>
{
join.KeyColumn("Status")
.Map(x => x.Status);
join.Map(x => x.SortOrder).Not.Insert();
});
}
Eu não testei isso, mas essa é a essência disso.
Você pode especificar que uma propriedade não pode ser inserida ou atualizada usando Not.Insert()
ou Not.Update()
, respectivamente no seu mapeamento, ou não pode ser inserido nem atualizado usando ReadOnly()
.