真的需要ORM框架嗎?


在長期的Coding的實踐過程中發現未必需要一個ORM框架來作為低層數據訪問的工具,實際的業務邏輯所需要的對數據訪問的功能往往只是ORM框架一個小的子集,甚至連Mirco級別(如PetaPoco, Dapper)的ORM框架都可以不用。當然這是只針對在一種類型數據庫平台上開發而言,不涉及到系統要有跨數據庫平台的特性。其實現實系統中真正需要跨數據庫平台的系統並不多。

本人並不否認大型的ORM框架如EF、NHibernate對業界所作出的貢獻,但在使用之前需要搞清楚:

1. 需要解決的問題是什么?

2. 框架的引入需要付出什么?

3. 有沒有更簡單的替代方法?

其實我關注的是第3點,在實現項目中我使用過Mirco ORM如Dapper,但逐漸也沒再用了,還是直接寫數據訪問的代碼,為了提高編碼的效率,編寫了一個在SQL Server中使用的存儲過程,用來生成C#代碼。

 

CREATE PROCEDURE [dbo].[GenerateEntity]
  @tableName VARCHAR(60),
  @getset BIT = 0
AS
BEGIN
    DECLARE @output AS VARCHAR(MAX);
    DECLARE @newline AS VARCHAR(2) =  CHAR(13) + CHAR(10)
    DECLARE @lines AS TABLE ( line VARCHAR(255) )
    DECLARE @line VARCHAR(255)
    
    SET NOCOUNT ON
    
    INSERT INTO @lines
    SELECT 'public ' +
        CASE WHEN DATA_TYPE='varchar' OR DATA_TYPE='nvarchar' THEN 'string'
             WHEN DATA_TYPE='tinyint' THEN 'byte'  
             WHEN DATA_TYPE='bit' THEN 'bool' 
             WHEN DATA_TYPE='datetime' OR DATA_TYPE='datetime2' THEN 'DateTime' 
             ELSE DATA_TYPE END + 
        CASE WHEN IS_NULLABLE='YES' AND NOT (DATA_TYPE='varchar' OR DATA_TYPE='nvarchar') THEN '? ' ELSE ' ' END + COLUMN_NAME +
        CASE WHEN @getset = 0 THEN ';' ELSE ' { get; set; }' END
    FROM  INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @tableName
    
    SET @output = 'public class ' + @tableName + @newline + '{' + @newline;
    
    DECLARE cur CURSOR FOR SELECT line FROM @lines
    OPEN cur 
    FETCH cur INTO @line
    WHILE @@FETCH_STATUS = 0
    BEGIN
        SET @output += '    ' + @line + @newline
        FETCH cur INTO @line    
    END
    CLOSE cur
    DEALLOCATE cur
    
    --SELECT @output + '}'  -- 在text output 窗口不能完整輸出
    SET @output += '}' + @newline 
    
    DECLARE @variableName VARCHAR(255) = LOWER(LEFT(@tableName, 1)) + RIGHT(@tableName, LEN(@tableName)-1)
    
    DELETE @lines
    INSERT INTO @lines
    SELECT @variableName + '.' + COLUMN_NAME + ' = '+
        CASE WHEN IS_NULLABLE='YES' THEN 'reader["'+COLUMN_NAME+'"] == DBNull.Value ? null : ' ELSE '' END +'(' + 
        CASE WHEN DATA_TYPE='varchar' OR DATA_TYPE='nvarchar' THEN 'string'
             WHEN DATA_TYPE='tinyint' THEN 'byte'  
             WHEN DATA_TYPE='bit' THEN 'bool' 
             WHEN DATA_TYPE='datetime' OR DATA_TYPE='datetime2' THEN 'DateTime' 
             ELSE DATA_TYPE END + 
       CASE WHEN IS_NULLABLE='YES' AND NOT (DATA_TYPE='varchar' OR DATA_TYPE='nvarchar') THEN '?' ELSE '' END + ')reader["' + COLUMN_NAME + '"];'
    FROM INFORMATION_SCHEMA.[COLUMNS] WHERE TABLE_NAME = @tableName
    
    SET @output += @tableName + ' ' + @variableName + ' = new ' + @tableName + '();' + @newline;

    DECLARE cur CURSOR FOR SELECT line FROM @lines
    OPEN cur 
    FETCH cur INTO @line
    WHILE @@FETCH_STATUS = 0
    BEGIN
        SET @output += @line + @newline
        FETCH cur INTO @line    
    END
    CLOSE cur
    DEALLOCATE cur
        
    PRINT @output;
END
View Code

如果覺得在SQL生成代碼不夠爽,可以考慮使用:Razor Engine

http://www.cnblogs.com/artech/p/razor-code-generation.html

http://razorengine.codeplex.com/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM