2012-04-13 88 views
3

我在我的数据库中有一个表,我想用getter和setter创建一个模型类。对于我的项目中的大部分任务,我正在使用PetaPoco。我手动创建模型,但很少有表格有很多列。如何使用PetaPoco库自动创建数据库模型?

有什么方法可以使用PetaPoco从数据库创建模型?

+1

来自peta poco的t4模板无法做到这一点? – wiero 2012-04-13 09:58:42

回答

4

PetaPoco有T4 Visual Studio模板应该为你做这个。如果您不想让它们全部生成,只需使用该模板,然后从所需的* .cs文件中复制这些类。

您会在PetaPoco's GitHub code repo上找到模板。

模板添加到您的项目可以通过两种方式来完成:

  1. 复制在包控制台中使用的NuGet或使用Visual Studio程序包管理器将文件手动
  2. 。详细信息on NuGet site

我会推荐第二个选项,因为您可以在构建之前将它们设置为自动下载时(CVS的一部分)。

+0

我使用了为我生成DAL的Database.tt。从该列表中选择哪一个用于创建表格类? – RKh 2012-04-17 07:22:59

+0

@RPK:你从那个list_中得到什么意思?什么名单?默认情况下,它应该生成数据库类和模式类。据我所知。我自己编写手动POCO,但通过快速浏览模板,应该生成表类并将其包含在生成的'Database.cs'文件中。 – 2012-04-17 07:45:53

+0

在列表中,我的意思是你给我的链接中显示的.tt。我也手动编写POCO,但我想用T4添加一个。哪个T4模板可以运行?它会干扰现有的POCO吗? – RKh 2012-04-17 08:33:48

5

我强烈建议您使用T4模板,因为它可以使流程更加快速以及添加其他功能。

的最快方法是打开“包管理器控制台”(工具>库包管理器>包管理器控制台),请确保您的项目在“默认项目”选择下拉菜单和运行:

PM>install-package petapoco 

这将创建一个名为“Models”的文件夹和一个名为“Generated”的子文件夹。在“生成”文件夹中,打开“Database.tt”文件并设置信息。有关设置的信息,请参阅http://www.toptensoftware.com/petapoco/

成功设置T4模板后,它将生成一个名为“Database.cs”的代码文件,其中包含数据库中的所有对象。产生的是“部分班级”。这里的关键是你不应该修改这个文件中的任何对象。相反,您将在相同的名称空间中创建一个新的部分类,然后您可以实现更多的逻辑。移动/更新您的现有对象以确认新的设置。

另一种选择是创建一些TSQL来生成一些代码。这是一个非常粗糙的例子,我过去用它来为我的PetaPoco表生成接口。

declare @script nvarchar(max); 
declare @table nvarchar(256); 

set @table = 'YourTableName' 

set @script = 'public interface I' + @table + '{' + char(10); 
SELECT 
    @script = @script + 
     CASE 
      WHEN st.Name IN ('int') AND c.is_nullable = 0 THEN 'int' 
      WHEN st.name in ('smallint') AND c.is_nullable = 0 THEN 'short' 
      WHEN st.name IN ('bigint') AND c.is_nullable = 0 THEN 'long' 
      WHEN st.name IN ('varchar','nvarchar','sysname') THEN 'string' 
      WHEN st.Name IN ('datetime') AND c.is_nullable = 0 THEN 'DateTime' 
      WHEN st.Name IN ('bit') AND c.is_nullable = 0 THEN 'bool' 
      WHEN st.Name IN ('decimal') AND c.is_nullable = 0 THEN 'decimal' 
      /* NULLABLE VALUES */ 
      WHEN st.Name IN ('int') AND c.is_nullable = 1 THEN 'int?' 
      WHEN st.name in ('smallint') AND c.is_nullable = 1 THEN 'short?' 
      WHEN st.name IN ('bigint') AND c.is_nullable = 1 THEN 'long?' 
      WHEN st.name IN ('varchar','nvarchar','sysname') AND c.is_nullable = 1 THEN 'string?' 
      WHEN st.Name IN ('datetime') AND c.is_nullable = 1 THEN 'DateTime?' 
      WHEN st.Name IN ('bit') AND c.is_nullable = 1 THEN 'bool?' 
      WHEN st.Name IN ('decimal') AND c.is_nullable = 1 THEN 'decimal?' 
      --WHEN st.name IN('sysname') AND c.is_nullable = 1 THEN 'string?'  
      ELSE 'UNKOWN-' + st.name 
     END 
    + ' ' + c.name + '{get;set;}' + char(10) 
FROM sys.tables t 
INNER JOIN sys.columns c 
ON t.object_id = c.object_id 
INNER JOIN sys.types st 
ON st.system_type_id = c.system_type_id 
WHERE t.name = @table 

print @script + '}' 

我希望这有助于。

+0

TSQL上的Thanx我可以问为什么在SQL中没有FLOAT类型的实现,你忘了FLOAT还是有其他原因? – adopilot 2013-05-28 14:14:36

+0

很高兴为您提供帮助。这只是一个可以从数据库中提取信息的方式的一个快速和肮脏的例子。你应该能够在逻辑中添加另一个条件来实现这一点。 – anAgent 2013-05-28 16:01:14

0

在Visual Studio中,您可以使用集成的Entity Framework的“Code first from database”函数来生成POCO类,以便与PetaPoco一起使用。只需生成它们并删除所有不必要的EF垃圾桶,如DBContext和属性。通过这种方式,您不仅可以为C#生成POCO,还可以为VB.NET生成POCO及其全部可视化点击,而不会与T4模板混淆。

项目/添加新项目... /数据/ ADO。NET实体数据模型/代码首先来自数据库