0

レガシーシステムのデータレイヤーをNHibernateを使用するように変換しています。古いデータベースには、マップしたいストアドプロシージャがロードされています。物事のネーミングに悩まされています。これらのプロシージャは単純なエンティティを返しません。混乱を返します。例は次のようになります。

USE [MYDB]
GO
/****** Object:  StoredProcedure [dbo].[GetInvoiceRenewals]    Script Date: 06/21/2012    10:24:05 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:      <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
ALTER PROCEDURE [dbo].[GetInvoiceRenewals]
@ClientId int,
@UserId int
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;


IF (@ClientId IN (SELECT ClientId FROM dbo.UserClientIds(@UserId)))
BEGIN

    SELECT I.InvoiceId, I.ClientId, I.InvoiceTypeId, I.InvoiceNumber, I.QuoteNumber, I.PONumber,
        I.TotalListPrice, I.EstimatedFee, I.ActualFee, I.DateCreated, u.firstname + ' ' + u.lastname as 'UserCreated',i.billingAddressID,i.shippingAddressID,
        I.ActualClientPrice,
        (select InvoiceStatus from InvoiceStatus where invoiceStatusID = (Select Case When Not Exists (Select * from InvoiceStatusHistory where InvoiceId=I.InvoiceID) Then 1
Else (Select top 1 InvoiceStatusID from InvoiceStatusHistory where InvoiceId=I.InvoiceID Order By ActionDate Desc) End)) as Status
    FROM Invoice I, [user] u
    WHERE I.ClientId = @ClientId AND I.IsActive = 1 AND I.InvoiceTypeId = 3 and u.userID = i.userCreated

END
END


--Select Case When Not Exists (Select * from InvoiceStatusHistory where    InvoiceId=I.InvoiceID) Then 1
--  Else (Select InvoiceStatusID from InvoiceStatusHistory where InvoiceId=I.InvoiceID)    End
--
--InvoiceStatusID is NULL then 1 else InvoiceStatusID END from InvoiceStatusHistory 
--                          where InvoiceId=1860 Order By    ActionDate Desc

今、それらの何百ものを想像してください。これらすべてをhbmファイルに生成し、エンティティも作成するスクリプトを作成することは明らかです。私が探しているのは、これらのprocエンティティの適切な命名構造ですか?何かご意見は?

4

1 に答える 1

1

NHibernateがこれに本当に適しているとは思いません。NHibernateに変換する場合は、エンティティをストアドプロシージャではなく、テーブルに(大まかに)マップする必要があります。

また、この例では、ストアドプロシージャにロジックがあり、imoはコードでより適切に表現されます。これには、エンティティをテーブルにマッピングし、それらのエンティティから作業する必要があります。

NHibernateに移行したいので、エンティティをテーブルにマッピングしてから、アプリケーションを段階的に使用するエンティティに移行し、ストアドプロシージャを使用したままにしておくことをお勧めします(必要に応じて、セッションを使用してストアドプロシージャをいつでも呼び出すことができます。 CreateSQLQuery( "..."))

于 2012-06-21T17:24:16.717 に答える