Pergunta : Problema do esconderijo de Nhibernate ao usar disparadores de MS-SQL

Hey! o

I am using Nhibernate com fluente, para persistir uma base de dados expressa do MS SQL 2008 em um negócio application.

I tem uma classe nomeada Recibo que contem uma lista com muitos objetos nomeados ReceiptItems. o usuário do
The pode criar um recibo, adicionar-lhe Receiptitems, e editá-lo contanto que sua peça nao marcada de Finished.
This trabalhar bem e conservar ao DB corretamente.
Now para o problema: o

I igualmente tem um disparador no recibo da tabela do sql, de que fogos se introduzido. Finished são os preços novos dos esforços do disparador de true.
The do “da tabela fornecedor”, e atualizam os preços para todo o ReceiptItems,
in o ReceiptItems table.

When que chama o then
transaction do
and do
session.SaveorUpdate (value). Cometer () causas dos últimos do

the a exceção: o
StaleObjectStateException
Row era atualizado ou suprimido uma outra transação (ou por um traço do unsaved-valor estava incorreto) em ReceiptItems



Removing o ofcourse do disparador repara o problema, mas eu preciso-o de atualizar os preços. Há alguma maneira para que o nhibernate ignore o
error, e refresca seu esconderijo após os fogos do disparador? definições do exemplo da classe do




straightforward com mappings fluentes: class= " lineNumbers " >
1 do >

 recibo público da classe
    {

        recibo público () {}
        /// Identificator///
        identificação virtual pública do int {começ; jogo confidencial; }
         de /// se verdadeiro finished, cant edita os dados 
        bôoleano virtual público terminado {começ; jogo; }
        Items de /// deste recibo 
        artigos virtuais públicos de IList {começ; jogo; }
    }

    /// que Mapping para NHibernate  fluente
    classe pública ProdajaMap: ClassMap
    {
       
        ReceiptMap público ()
        {
            Tabela (“recibo”);
            OptimisticLock.All ();
            DynamicUpdate ();
            Identificação (=> x.Id de x);
            Mapa (=> x.Finished de x);
            HasMany (=> x.Items) .AsBag de x () .KeyColumn (“Receipt_ID”);
        }
    } class= desobstruído " lineNumbers " >
1 do >


classe pública ReceiptItem
    {

        ReceiptItem público () {}

        identificação virtual pública do int {começ; jogo confidencial; }
        Id de /// do recibo 
        int virtual público Receipt_ID {começ; jogo; }

        preço mais Supplier  de ///
        preço decimal virtual público {começ; jogo; }
        disconto mais Supplier  de ///
        disconto decimal virtual público {começ; jogo; }
    }

    /// que Mapping para NHibernate  fluente
    classe pública ReceiptItemMap: ClassMap
    {
        ReceiptItemMap público ()
        {
            Tabela (“ReceiptItems”);
            OptimisticLock.All ();
            DynamicUpdate ();
            Identificação (=> x.Id de x);
            Mapa (=> x.Receipt_ID de x). Coluna (“Receipt_ID”);
            Mapa (=> x.Price de x);
            Mapa (=> x.Discount de x);

        }
    } class= >



Thanks de


class= do

Resposta : Problema do esconderijo de Nhibernate ao usar disparadores de MS-SQL

Eu não tentaria combinar ambos os disparadores e o uso de uma camada de dados tal como o nhibernate - você está indo sempre começ problemas de sincronização. o nHibernate é pretendido controlar seus dados - e sua camada do negócio deve controlar processos tais como a atualização de seus preços. Pessoal eu não vou perto dos disparadores para nenhuma lógica de negócio - para examinar talvez, mas de nada mais. Eu penso que obscurecem a lógica de negócio e a fazem nigh em impossível executar outras soluções do código para controlar os dados - como você está encontrando.
Por que não mover seu código do disparador em um procedimento armazenado e chamar o procedimento dentro do espaço da transação da atualização se “terminou” a bandeira é verdadeiro? Eu controlaria este dentro da camada do negócio, mas você poderia mover este para a camada de dados se você deseja.

Tim
Outras soluções  

 
programming4us programming4us