2013-05-22 107 views
2

我聽說人們使用實體框架從數據庫生成模型相關的類。假設如果我不想使用實體框架作爲數據訪問層,而是想使用MS數據應用程序塊,那麼我怎麼能自動從數據庫生成mvc中的模型類,而不是手動編寫與模型相關的類。請以所有可能的方式指導我。謝謝從數據庫中自動生成mvc中的模型類

+0

你應該看看了LINQ to SQL和如何使用拖放UI與它去。這裏有一個教程:http://www.codeproject.com/Articles/22000/LINQ-to-SQL – mattytommo

+0

如果你可以從你的數據庫生成xsd文件,那麼你可以使用xsd.exe從xsd文件生成類。 –

+0

我認爲你正在尋找這個工具https://visualstudiogallery.msdn.microsoft.com/72a60b14-1581-4b9b-89f2-846072eff19d – tsohtan

回答

2

好方法是使用ADO.NET實體數據模型: 在Visual Studio中右鍵單擊你的項目 - >「添加」 - >「新建項目」 - >「數據」 - >「ADO。 NET實體數據模型「 - >」從數據庫生成「 - >選擇或創建連接 - >選擇表 - >展開創建* .tt文件組 - >您得到它:-)

+0

我說我不會使用實體框架,而是我想使用MSDAAB,而不是爲什麼你是說使用EF? – Thomas

+0

對不起,如果它不適合你。但對於一次性使用,這是最好的方法。課後生成你不需要使用EF。 –

+0

我已經這樣做了。但是我的班級沒有一個構造函數。在你的情況下,它有一個構造函數嗎? – msysmilu

1

我知道這是一個老問題但是對於一個快速而輕鬆的課程,我在短信中使用它。它添加了我經常使用的'required'和'string-length'數據註釋。

Based upon this answer.

DECLARE @TableName VARCHAR(MAX) = 'tablename' -- Replace 'tablename' with your table name 
    DECLARE @NameSpace VARCHAR(MAX) = 'namespace' -- Replace 'namespace' with your class namespace 
    DECLARE @TableSchema VARCHAR(MAX) = 'dbo' -- Replace 'dbo' with your schema name 
    DECLARE @result varchar(max) = '' 

    SET @result = @result + 'using System;' + CHAR(13) 
    SET @result = @result + 'using System.ComponentModel.DataAnnotations;' + CHAR(13) + CHAR(13) 

    IF (@TableSchema IS NOT NULL) 
    BEGIN 
     SET @result = @result + 'namespace ' + @NameSpace + CHAR(13) + '{' + CHAR(13) 
    END 

    SET @result = @result + 'public class ' + @TableName + CHAR(13) + '{' + CHAR(13) 

    SET @result = @result + '#region Instance Properties' + CHAR(13) 

    SELECT @result = @result + CHAR(13)  
     + ' [Display(Name = "' + ColumnName + '")] ' + CHAR(13) 
     + CASE bRequired WHEN 'NO' 
     THEN 
     CASE WHEN Len(MaxLen) > 0 THEN ' [Required, StringLength(' + MaxLen + ')]' + CHAR(13) ELSE ' [Required] ' + CHAR(13) END 
     ELSE 
     CASE WHEN Len(MaxLen) > 0 THEN ' [StringLength(' + MaxLen + ')]' + CHAR(13) ELSE '' END 
     END 
     + ' public ' + ColumnType + ' ' + ColumnName + ' { get; set; } ' + CHAR(13) 
    FROM 
    (
     SELECT c.COLUMN_NAME AS ColumnName 
      , CASE c.DATA_TYPE 
       WHEN 'bigint' THEN 
        CASE C.IS_NULLABLE 
         WHEN 'YES' THEN 'Int64?' ELSE 'Int64' END 
       WHEN 'binary' THEN 'Byte[]' 
       WHEN 'bit' THEN 
        CASE C.IS_NULLABLE 
         WHEN 'YES' THEN 'Boolean?' ELSE 'Boolean' END    
       WHEN 'char' THEN 'String' 
       WHEN 'date' THEN 
        CASE C.IS_NULLABLE 
         WHEN 'YES' THEN 'DateTime?' ELSE 'DateTime' END       
       WHEN 'datetime' THEN 
        CASE C.IS_NULLABLE 
         WHEN 'YES' THEN 'DateTime?' ELSE 'DateTime' END       
       WHEN 'datetime2' THEN 
        CASE C.IS_NULLABLE 
         WHEN 'YES' THEN 'DateTime?' ELSE 'DateTime' END       
       WHEN 'datetimeoffset' THEN 
        CASE C.IS_NULLABLE 
         WHEN 'YES' THEN 'DateTimeOffset?' ELSE 'DateTimeOffset' END          
       WHEN 'decimal' THEN 
        CASE C.IS_NULLABLE 
         WHEN 'YES' THEN 'Decimal?' ELSE 'Decimal' END          
       WHEN 'float' THEN 
        CASE C.IS_NULLABLE 
         WHEN 'YES' THEN 'Single?' ELSE 'Single' END          
       WHEN 'image' THEN 'Byte[]' 
       WHEN 'int' THEN 
        CASE C.IS_NULLABLE 
         WHEN 'YES' THEN 'Int32?' ELSE 'Int32' END 
       WHEN 'money' THEN 
        CASE C.IS_NULLABLE 
         WHEN 'YES' THEN 'Decimal?' ELSE 'Decimal' END             
       WHEN 'nchar' THEN 'String' 
       WHEN 'ntext' THEN 'String' 
       WHEN 'numeric' THEN 
        CASE C.IS_NULLABLE 
         WHEN 'YES' THEN 'Decimal?' ELSE 'Decimal' END                
       WHEN 'nvarchar' THEN 'String' 
       WHEN 'real' THEN 
        CASE C.IS_NULLABLE 
         WHEN 'YES' THEN 'Double?' ELSE 'Double' END                   
       WHEN 'smalldatetime' THEN 
        CASE C.IS_NULLABLE 
         WHEN 'YES' THEN 'DateTime?' ELSE 'DateTime' END          
       WHEN 'smallint' THEN 
        CASE C.IS_NULLABLE 
         WHEN 'YES' THEN 'Int16?' ELSE 'Int16'END    
       WHEN 'smallmoney' THEN 
        CASE C.IS_NULLABLE 
         WHEN 'YES' THEN 'Decimal?' ELSE 'Decimal' END                   
       WHEN 'text' THEN 'String' 
       WHEN 'time' THEN 
        CASE C.IS_NULLABLE 
         WHEN 'YES' THEN 'TimeSpan?' ELSE 'TimeSpan' END                      
       WHEN 'timestamp' THEN 
        CASE C.IS_NULLABLE 
         WHEN 'YES' THEN 'DateTime?' ELSE 'DateTime' END          
       WHEN 'tinyint' THEN 
        CASE C.IS_NULLABLE 
         WHEN 'YES' THEN 'Byte?' ELSE 'Byte' END             
       WHEN 'uniqueidentifier' THEN 'Guid' 
       WHEN 'varbinary' THEN 'Byte[]' 
       WHEN 'varchar' THEN 'String' 
       ELSE 'Object' 
      END AS ColumnType, 
       c.IS_NULLABLE AS bRequired, 
       CASE c.DATA_TYPE    
       WHEN 'char' THEN CONVERT(varchar(10),c.CHARACTER_MAXIMUM_LENGTH) 
       WHEN 'nchar' THEN CONVERT(varchar(10),c.CHARACTER_MAXIMUM_LENGTH) 
       WHEN 'nvarchar' THEN CONVERT(varchar(10),c.CHARACTER_MAXIMUM_LENGTH) 
       WHEN 'varchar' THEN CONVERT(varchar(10),c.CHARACTER_MAXIMUM_LENGTH) 
       ELSE '' 
      END AS MaxLen, 
      c.ORDINAL_POSITION 
    FROM INFORMATION_SCHEMA.COLUMNS c 
    WHERE c.TABLE_NAME = @TableName and ISNULL(@TableSchema, c.TABLE_SCHEMA) = c.TABLE_SCHEMA 
    ) t 
    ORDER BY t.ORDINAL_POSITION 

    SET @result = @result + CHAR(13) + '#endregion Instance Properties' + CHAR(13) 

    SET @result = @result + '}' + CHAR(13) 

    IF (@TableSchema IS NOT NULL) 
    BEGIN 
     SET @result = @result + CHAR(13) + '}' 
    END 

    PRINT @result 
相關問題